主要思想
用空间换时间
解决思路
- 如果要找到两数,首先需要遍历nums[i],然后找到对应的target-nums[i]
- 遍历nums[i]需要时间复杂度O(n),遍历剩下的数组,找到对应的target-nums[i]需要O(n)
- 所以如果是暴力枚举的话,时间复杂度是O(n^2) 但是如果用hashMap则是:
- 首先遍历nums[i]
- 遍历之后,检查hashMap中是否有值,如果有,则找到,否则加入到hashMap(这里需要注意,因为我们判断的内容是map中是否有target-nums[i],用的map.has(target-nums[i]),map需要找到键所以需要将其设置为键,而不是设置为值,这也是为什么代码中需要用map.set(nums[i],i)而不是map.set(i,nums[i])的原因)
- 这样的话就可以把之前遍历过的nums[i]放在一个新的内存空间中,然后下一次查找不用找i后面的数组内容,而只需要取hash内存中找即可
代码
暴力解决法
`function twoSum(nums,target){
let len = nums.length;
if(len<0) return
//首先遍历nums[i]
for(let i=0;i<len;i++){
//遍历找到target-nums[i],又因为其不能和i一样,所以j要从i+1开始取
for(let j=i+1;j<len;j++){
if(nums[i]+nums[j] == target){
return [i,j]
}
}
}
return
}`
hashMap方法
`function twoSum(nums,target){
let len = nums.length;
if(len<0) return
let map = new Map();
for(let i=0;i<len;i++){
if(map.has(target-nums[i])){
return [map.get(target-nums[i]),i]
}else{
map.set(nums[i],i)
}
}
return
}`