LeetCode 01. 两数之和 (Two Sum)
题目链接: 1. 两数之和 - 力扣
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
思路剖析:为什么选择 HashMap?
我们在遍历数组时,核心诉求是:判断当前元素之前是否已经遍历过某个特定的值。
根据哈希法的常规选型思路(数组 vs Set vs Map):
- 明确查找目标:我们需要寻找的配对数是
所需数 = target - 当前数。 - 确定数据结构:如果只需要判断“所需数”是否存在,用
Set就足够了。但本题要求返回数组下标。 - 得出结论:我们需要将**[元素]和[下标]**绑定存储。因此,我们选择用
HashMap。- Key (查找目标):遍历过的元素值。
- Value (附加信息):该元素对应的数组下标。
模拟过程
以数组 [1, 3, 7, 5],target = 8 为例,我们模拟一下代码执行的全过程:
| 遍历进度 | 当前元素 (num) |
需要寻找的差值 (target - num) |
HashMap 当前状态 (Key:Value) | 操作结果 |
|---|---|---|---|---|
i = 0 |
1 | 8 - 1 = 7 | 空 | Map 里没有 7,把 (1:0) 存入 Map |
i = 1 |
3 | 8 - 3 = 5 | {1:0} |
Map 里没有 5,把 (3:1) 存入 Map |
i = 2 |
7 | 8 - 7 = 1 | {1:0, 3:1} |
Map 里存在 1, 它的 Value (下标) 是 0。 |
得出结论: 存在能与7相加得到target的数,直接返回该元素的下标 0 和当前指针 i 的下标 2,即 [0, 2]。
代码实现
import java.util.HashMap;
class Solution {
public int[] twoSum(int[] nums, int target) {
// 用于存储已遍历过的数值及其对应的下标 (Key: 数值, Value: 下标)
HashMap<Integer,Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
// 检查哈希表中是否存在能与当前数相加等于 target 的目标数
if(map.containsKey(target - nums[i])){
// 若存在,说明配对成功。
return new int[]{map.get(target - nums[i]), i};
}
// 若不存在,将当前数及下标记录到哈希表中,供后面的数进行匹配
map.put(nums[i], i);
}
// 题目保证有解,此处为兜底返回,保证方法有确定的返回值
return new int[0];
}
}