解题思路
- 用 hashMap 存一下遍历过的元素和对应的索引。
- 每访问一个元素,查看一下 hashMap 中是否存在满足要求的目标数字。
用Object实现
const twoSum = (nums, target) => {
// 存放出现过的数字,和对应的索引
const prevNums = {};
// 遍历元素
for (let i = 0; i < nums.length; i++) {
// 当前元素
const curNum = nums[i];
// 满足题目要求的目标元素
const targetNum = target - curNum;
// 在prevNums中找目标元素的索引
const targetNumIndex = prevNums[targetNum];
// 如果存在,直接返回 [目标元素的索引, 当前索引]
if (targetNumIndex !== undefined) {
return [targetNumIndex, i];
}
// 如果不存在,说明之前没出现过目标元素
// 每次都存入当前元素和对应的索引
prevNums[curNum] = i;
}
}
//作者:xiao_ben_zhu
//链接:https://leetcode-cn.com/problems/two-sum/solution/qing-xi-de-bian-liang-ming-ming-bang-zhu-ji-yi-bu-/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
用Map实现
const twoSum = (nums, target) => {
// 1. 构造哈希表
const map = new Map(); // 存储方式 {need, index}
// 2. 遍历数组
for (let i = 0; i < nums.length; i++) {
// 2.1 如果找到 target - nums[i] 的值
if (map.has(nums[i])) {
return [map.get(nums[i]), i];
} else {
// 2.2 如果没找到则进行设置
map.set(target - nums[i], i);
}
}
};
//作者:jsliang
//链接:https://leetcode-cn.com/problems/two-sum/solution/javascript-map-by-jsliang/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
注意,除了抛出异常以外,没有办法中止或跳出 forEach() 循环
var twoSum = function(nums, target) {
const map =new Map();
let result =null;
nums.forEach((item,index)=>{
if(map.has(item)){
result =[map.get(item),index];
// 不能在这里返回,forEach循环没有办法中止
// 返回值也不是函数twoSum的返回值
// return [map.get(item),index];
}else{
map.set(target-item,index)
}
})
return result;
};
这些数组方法则可以对数组元素判断,以便确定是否需要继续遍历: Array.prototype.every 、 Array.prototype.some()、 Array.prototype.find() 、 Array.prototype.findIndex()
var twoSum = function(nums, target) {
var _result
nums.some(function (item, index) {
var _index = nums.indexOf(target - item)
if (_index !== -1 && index !== _index) {
_result = [index, _index]
return true
}
})
return _result
};
作者:keng-ren-de-xiao-shu-tong
链接:https://leetcode-cn.com/problems/two-sum/solution/js-zhong-duan-somexun-huan-by-keng-ren-de-xiao-s-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
indexOf实现
特点
- 从后往前遍历,这样比从前往后更高效
- 每一次变量都
var twoSum = function(nums, target) {
let i = nums.length;
while(i > 1) {
let last = nums.pop();
if (nums.indexOf(target - last) > -1) {
return [nums.indexOf(target - last), nums.length]
}
i--
}
};
//作者:lin-536
//链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-lin-536/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。