1. 题目描述
LeetCode 1. 两数之和(Two Sum)
给定一个整数数组 nums
和一个目标值 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. 解题思路
方法:哈希表(HashMap)
我们可以使用 哈希表(HashMap
)来存储数组中已经遍历过的元素及其索引。
思路如下:
-
遍历
nums
数组,对于每个元素nums[i]
,计算它的补数target - nums[i]
。 -
检查这个补数是否已经存在于
HashMap
中。-
如果存在,说明找到了满足条件的两个数,返回它们的索引。
-
如果不存在,将
nums[i]
及其索引存入HashMap
,继续遍历。
-
3. Java 代码实现
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> ma = new HashMap<>();
int[] ans = new int[2];
for (int i = 0; i < nums.length; i++) {
int tmp = target - nums[i];
if (ma.containsKey(tmp)) {
ans[0] = ma.get(tmp);
ans[1] = i;
return ans; // 立即返回,避免继续遍历
} else {
ma.put(nums[i], i);
}
}
return ans; // 题目保证一定有解
}
}
4. 复杂度分析
-
时间复杂度:O(n)
-
只需遍历数组一次,每次操作(查找和插入
HashMap
)都是 O(1) 的时间复杂度。
-
-
空间复杂度:O(n)
-
需要存储
nums
中最多n
个不同的元素。
-
5. 总结
-
该题目是经典的哈希表应用,利用
HashMap
可以高效查找所需的数值。 -
通过
target - nums[i]
计算补数,并在HashMap
中查找是否存在,可以快速确定答案。 -
代码整体逻辑清晰,时间复杂度 O(n),适用于大多数情况。
希望这篇文章能帮助你理解 两数之和(Two Sum) 的解法!