优质博文:IT-BLOG-CN
一、题目
给定一个整数数组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
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于O(n2)
的算法吗?
二、代码
思路:
【1】先获取数组中的第一个元素,通过target - num[i] = x
,直接过去x
的下标,存在直接返回当前索引和查询到的索引,但需要对[3,3]=6
等特殊场景进行处理。
【2】们发现这个题目属于hash
表下面的,所以使用hash
表来实现。可以用key
保存数值,用value
在保存数值所在的下标。map
中的存储结构为{key:数据元素,value:数组元素对应的下表}
在遍历数组的时候,只需要向map
去查询是否存在target - num[i] = x
中的x
,如果存在,就返回value
也就是下标和i
,如果没有,就把目前遍历的元素放进map
中,因为map
存放的就是我们访问过的元素。
class Solution {
public int[] twoSum(int[] nums, int target) {
// 先获取数组中的第一个元素,通过 target - num[i] = x, 直接过去x的下标,存在直接返回,需要对[3,3]相同的做特殊处理。
// 我们发现这个题目属于 hash表下面的,所以使用hash表来实现。可以用key保存数值,用value在保存数值所在的下标
// map中的存储结构为 {key:数据元素,value:数组元素对应的下表}
int[] res = new int[2];
Map<Integer,Integer> map = new HashMap();
for (int i = 0; i < nums.length; i++) {
int x = target - nums[i];
if (map.containsKey(x)) {
res[0] = map.get(x);
res[1] = i;
return res;
}
map.put(nums[i], i);
}
return res;
}
}