LeetCode-两数之和(001)
一.题目描述
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
二.示例
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
三.提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
- 只会存在一个有效答案
四.解法:
方法一:哈希表
我们可以使用一个哈希表 d 来存储每个元素及其对应的索引。
遍历数组 nums,对于当前元素 nums[i],我们首先判断 target−nums[i] 是否在哈希表 d 中,如果在 d 中,说明 target 值已经找到,返回 target−nums[i] 的索引和 i 即可。
时间复杂度 O(n),空间复杂度 O(n),其中 n 为数组 nums 的长度。
Java代码
class Solution {
public int[] twoSum(int[] nums, int target) {
// 创建一个哈希映射,用于存储数组元素的值和对应的索引
Map<Integer, Integer> d = new HashMap<>();
// 遍历数组
for (int i = 0;; ++i) {
// 获取当前索引 i 处的数组元素
int x = nums[i];
// 计算与 x 互补的值 y
int y = target - x;
// 检查哈希映射中是否存在键 y
if (d.containsKey(y)) {
// 如果存在,返回两个数的索引
return new int[] {d.get(y), i};
}
// 将当前元素 x 及其索引 i 存入哈希映射
d.put(x, i);
}
}
}
Kotlin代码
class Solution {
fun twoSum(nums: IntArray, target: Int): IntArray {
// 创建一个可变的哈希映射,用于存储数组元素的值和对应的索引
val m = mutableMapOf<Int, Int>()
// 使用 forEachIndexed 遍历数组,获取每个元素及其索引
nums.forEachIndexed { i, x ->
// 计算与 x 互补的值 y
val y = target - x
// 从哈希映射中获取 y 的索引 j
val j = m.get(y)
// 如果 j 不为 null,说明找到了两个数
if (j != null) {
// 返回两个数的索引
return intArrayOf(j, i)
}
// 将当前元素 x 及其索引 i 存入哈希映射
m[x] = i
}
// 如果没有找到,返回一个空的数组
return intArrayOf()
}
}