题目描述
解决思路
本题很简单,只要使用双重循环,就可以解决,但是双重循环执行时间长,复杂度高,不推荐。
我们可以使用循环+map的方式来解决此问题
假设
int[] nums = new int[]{9,-3, 4, 3, 90};
int target = 0;
分析:
很明显在上述示例中 -3和3 这两项符合要求。有没有办法循环到3时,找到-3及其下标呢?我们把这个-3当做key,把下标当做value存到存到map中,是不是就可以了?
想像一下,当循环到3时,数组下标=3,map={9=0, -3=1, 4=2},那么我们只需判断map.containsKey(-3)是否为true就行。
解决方案—循环+map
public static void main(String[] args) {
int[] nums = new int[]{9,-3,4,3,90};
int target = 0;
int[] result = twoSum(nums, target);
System.out.println(Arrays.toString(result));
}
// 关键思路:第一个数=总数-第二个数,我们先把第一个数作为key,下标作为value存到map中,
// 当循环到第二个数时,我们只需判断map.containsKey(总数-第二个数)是否为true即可
public static int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
// 存储数组的值和下标
Map<Integer, Integer> map = new HashMap<Integer,Integer>(nums.length);
// 第一项不用循环,可以先放到map中
map.put(nums[0],0);
// 从第二项开始循环
for(int i=1;i<nums.length;i++){
// 判断map中是否存在第一个数
if(map.containsKey(target-nums[i])){
// map中存在第一个数,第一个数的下标为value
result[0] = map.get(target-nums[i]);
// 第二个数的下标就是i
result[1] = i;
break;
}
map.put(nums[i],i);
}
return result;
}
示例代码的运行结果为
下图为力扣的运行结果