题目(难度:简单):
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
抛砖引玉
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
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
}

官方答案
这部分答案只有 java 的代码,手动转成 javascript,如有转换错误请指出
- 方法一:暴力法 暴力法很简单,遍历每个元素 xx,并查找是否存在一个值与 target - xtarget−x 相等的目标元素
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
for (var i = 0; i < nums.length; i++) {
for (var j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return [i, j]
}
}
}
}
- 方法二:一遍哈希表 为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素。如果存在,我们需要找出它的索引 在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
let targetMap = new Map()
for (let i = 0; i < nums.length; i++) {
const key = target - nums[i]
if (targetMap.has(key)) {
return [targetMap.get(key), i]
}
targetMap.set(nums[i], i)
}
}
高手在民间
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
let map = {} //key数字 value下标
let loop = 0 //循环次数
let dis //目标与当前值的差
while (loop < nums.length) {
dis = target - nums[loop]
if (map[dis] != undefined) {
return [map[dis], loop]
}
map[nums[loop]] = loop
loop++
}
return
}
菜鸡的自白
- 一般很少想到使用 while,while 的终止和迭代更好控制
- 因为数组提供了可以解决问题的方法就没有在意优化性能了,考虑性能问题对象的哈希查询是优于数组(indexOf、includes)查询的
个人解析
找到满足条件的两个数据是比较简单的, 有点麻烦的是确保数组中同一个元素不能使用两遍 那就要查询到满足条件的数据及时中断循环, 数组本事的遍历方法(map,some,every,filter...)可以通过 return 终止(详见- 小书童博客)