1.解法一:暴力解法
一开始用的方法比较笨,解题效率较低,用了两次遍历,时间复杂度为O(n²)
!!!太粗心了,if后面有一个返回值,如果没有走if那条路的话,就没有返回值,就会报错,所以要把情况考虑清楚。
2.解法二:hashmap解法
之前的暴力解法用了双层for循环,这里是用了两次for循环
public int[] twoSum(int[] nums, int target) {
//定义一个Hashmap数组
HashMap<Integer,Integer> map = new HashMap<>();
//new一个a数组存放找到的数字的位置
int[] a = new int[2];
for(int i = 0; i < nums.length; i ++){
map.put(nums[i],i);
}
for(int i = 0; i < nums.length; i ++){
int temp = target - nums[i];
//如果temp在map集合里面并且与之前的不是同一个
if(map.containsKey(temp) && map.get(temp) != i){
a[0] = i;
a[1] = map.get(temp);
}
}
return a;
}
3.解法二:hashmap解法继续优化
之前用的是两个for循环,这次用的是一次for循环,不过代码较难理解
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i ++){
//如果nums[i]在map集合中,则输出nums[i]的value和i
if(map.containsKey(nums[i])){
return new int[] {map.get(nums[i]),i};
}
//如果不在map集合中,则将target-nums[i]和i放入集合中
map.put(target - nums[i],i);
}
return new int[] {1,1};
}