代码
第一次
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const map = new Map()
for(let i = 0; i < nums.length; i++) {
// 登记
map.set(nums[i], i)
// 边登记边找媳妇
const her = target - nums[i]
if(map.has(her)) {
const loc = map.get(her)
if(loc !== i) {
return [i, loc]
}
}
}
// 重盘
for(let i = 0; i < nums.length; i++) {
// 找媳妇
const her = target - nums[i]
if(map.has(her)) {
const loc = map.get(her)
if(loc !== i) {
return [i, loc]
}
}
}
return []
};
此处思路有误!先登记再找媳妇,会出现3+3=6的情况,将出现两个问题:
-
先登记,再查找。很有可能
查到本人
,但有解决方案。if(loc !== i) { return [i, loc] }
-
先登记,后查找。如果是[3,3]的情况,字典保持
唯一性
,将只有一个3,解决办法就是重新再搜索一次。
第二次
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const map = new Map()
for(let i = 0; i < nums.length; i++) {
const her = target - nums[i]
if(map.has(her)) {
const loc = map.get(her)
return [i, loc]
}else {
map.set(nums[i], i)
}
}
return []
};
此处的思路是,相亲者A由婚介所查找数据库是否有配对,没有配对则入库,有配对则领走。相反,没有配对,说明当前库中没有配对上的人,那么配对上的人只能是后来者。如果后来者都没有配对上的,说明没有配对的人
。
时间空间复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(n)
思路
两个数可以比作成相亲对象
,目标就是target
。将所有相亲的人存入字典
中充当婚介所
。
婚介所配对规则:
- 先与本所的人查找,是否匹配?
- 匹配:配对!
不匹配:入库!说明库中没有适合的对象,那么适合的对象只存在后面来相亲的人。此处代表,无需重新再查找一次!后来者合适的,自然会选上。
总结
查找中,可以借用Set的has方法、Map的get和has方法、Array的includes方法代替手动查找,可以更快。