题目:
自己的想法:
class Solution {
public int[] twoSum(int[] nums, int target) {
//int[] indexarr = new int[2];
for (int i = 0; i < nums.length; i++) {
for(int j = i + 1; j<nums.length;j++){
if( (nums[i] + nums[j]) == target){
indexarr[0] = i;
indexarr[1] = j;
return indexarr;
}
}
}
return null;
}
}
遍历数组,从前到后求和,nums[0]+nums[1] , nums[0]+nums[2]……,nums[1]+nums[2], nums[1]+nums[3] ……
时间复杂度O(n^2), 效果不理想;如果数组非常长的话,做了很多不必要的计算
大佬思路:(哈希表,加法变减法)
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] indexarr = new int[2];
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if(map.containsKey(nums[i])){
indexarr[0] = i;
indexarr[1] = map.get(nums[i]);
return indexarr;
}
map.put(target-nums[i],i); //存的是补数和下标
}
return null;
}
}
遍历数组, 哈希表中存的是当前数的补数,以及下标。 通过判断有没有数据以当前数作为补数,有则返回,没有就继续往map里添加数据。遍历结束也没有的话返回null。