1.两数之和
题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例
示例1
java
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
示例2
java
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例3
java
输入:nums = [3,3], target = 6
输出:[0,1]
解题思路
哈希表
以第一个例子nums
=[2,7,11,15],target
= 9 为例,对数组中的每个元素而言,我们可以找和这个元素相加为target的元素(暂且称为互补元素
),如果这个互补元素
存在,那么就输出它们的下标:
- 2:存在7,使得2+7=9,它们符合条件
- 7:存在2,使得7+2=9,它们符合条件
- 11,不存在-2,使得11+(-2)=9,不符合条件
- 15,不存在-6,使得11+(-6)=9,不符合条件
可以看到2+7和7+2这两种情况其实重复输出了,为了避免重复输出,那么我们可以遍历数组,并逐个把元素放入HashMap,在放入的时候,就判断对于当前元素,现在HashMap中是否有互补元素
,如果有就直接输出他们的下标,不将互补元素
放入哈希表中。否则,如果对于当前元素,现在HashMap中没有互补元素
,那么我们就将当前元素放入哈希表中。
同时,HashMap也可以保证,值相同的元素只会放入一次,如果nums
=[2,2,7,11,15],target
= 9 ,那么2
也只会被放入一次。
实现设计
可以用HashMap存放<元素值,元素下标>键值对,如果符合条件的元素存在,就将他们的下标输出。否则就将这个元素和它的小标存入哈希表。
详细代码
java
class Solution {
public int[] twoSum(int[] nums, int target) {
//map的键存在元素值,map的值存在元素的下标
HashMap<Integer,Integer> map = new HashMap<>();
//res存放符合条件的下标对
int[] res=new int[2];
for(int i=0;i<nums.length;i++){
//tmp中暂存当前元素的互补元素
int tmp = target-nums[i];
//如果现在哈希表中存在当前元素的互补元素,把它们的下标放入res
if(map.containsKey(tmp)){
res[0]=i;
res[1]=map.get(tmp);
}else{
map.put(nums[i],i);
}
}
return res;
}
}