一、题目回顾
给定一个整数数组 nums 和一个目标值 target ,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。
- 限制:每个输入只对应一个答案;数组中同一个元素不能使用两遍。
二、💡 核心解题思路
这道题最经典的解法就是HashMap(哈希表),核心口诀是:“存差值,查补数”。
1. 为什么要用 HashMap?
- 暴力遍历(双层循环)的时间复杂度是 O(n²),太慢了。
- 使用 HashMap 可以将“查找另一个数”的速度从 O(n) 优化到 O(1),整体时间降为 O(n)。 2. 具体操作逻辑
- Key(键):存储数组中的元素值。
- Value(值):存储该元素对应的下标。
- 逻辑步骤: 1. 遍历数组时,计算当前元素需要“补谁”才能等于 target(即 complement = target - nums[i] )。 2. 查:看 HashMap 里有没有存过这个“补数”。 3. 存:如果没有,就把当前元素和下标存进去( map.put(nums[i], i) ),继续遍历。 4. 返:如果找到了,直接返回 [map.get(complement), i] 。
三、⚡ 代码实现
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer>hashtable = new HashMap<Integer,Integer>();
for (int i = 0;i < nums.length;++i){
if(hashtable.containsKey(target - nums[i])){
return new int[]{hashtable.get(target - nums[i]),i};
}
hashtable.put(nums[i],i);
}
return new int[0];
}
}
四、🧠 知识点速记
1. containsKey(key) :神器!用来快速判断“补数”有没有出现过。 2. 空间换时间:HashMap 占用了内存(存储数据),但是换来了速度的巨大提升。 3. 遍历顺序:先判断,后存入。避免把自己(当前元素)和自己配对。
五、总结
这道题是 HashMap 应用的入门第一课。记住 key 存数值,value 存下标,以后遇到“找两数之和/两数之差”这类快速查找题,第一反应就用它!