链接:1. 两数之和 - 力扣(LeetCode) (leetcode-cn.com)
思路:
1.暴力法,每个数和后面的数字比较看是否和为1,比较次数(n-1)+..(1)=n(n-1)/2,复杂度为O(n²),主要痛点为每个数n为了找到属于它的另一半target-n最坏都要遍历n次寻找,
2.hash表查找:每次在hash表里面看,一开始在想要不要先一次性把所有的数放进hash表,后面发现没有必要,先进入表的数始终会和后面的有比较,更不用说当然会有和原先就在表里面的数比较,此外如果预先放入数,还要判断数值是否等于自己。
做法:设置一个map,key为数值实际值,val为数组中对应的下标,然后遍历数组,如果当前hashmap找不到tatger-nums[i],则把该数字放入map,否则直接返回两者下标
代码:
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
if(map.containsKey(target-nums[i]))
return new int[]{i,map.get(target-nums[i])} ;
else{
map.put(nums[i],i);
}
}
return new int[0];
}