不说话,装高手。
Maintain silence and pretend to be an experta
暴力枚举,通过遍历 nums 数组中每一个元素 a,查找出 b = target - a,需要注意 a 之前的元素都已经和 a 匹配过,所以需要取 a 后面的元素来寻找 b
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
for(let i = 0; i < nums.length; i++) {
for(let j = i + 1; j < nums.length; j++) {
if(nums[i] + nums[j] === target) {
return [i, j]
}
}
}
};
得到当前值 a,计算出目标差值 b,检查哈希表是否存在目标差值,存在直接返回,不存在则将当前数字做为 key,当前下标做为 value 存进去
/**
* @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 a = nums[i]
const b = target - a
if(map.has(b)) {
return [map.get(b), i]
}
map.set(a, i)
}
};
双指针处理,分别取头部和尾部下标做为 left、right,在使用 sort 方法对数组从小到大进行排序,while循环处理,当 left 小于 right 时,通过指针计算两数之和 res,若 res 等于最终 target,则返回下标,通过 indexOf 方法获取原数组中的下标,如若 res !== target,则判断 res 是否小于 target,是 left 继续往前取,否 right 往后取
注意:为什么需要用 lastIndexOf 取下标?是为了当 nums === [3,3] 时,直接 indexOf 会取到两个下标都是 0
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let left = 0
let right = nums.length - 1
const sort = [...nums].sort((a, b) => a - b)
while(left < right) {
const res = sort[left] + sort[right]
if(res === target) {
return [nums.indexOf(sort[left]), nums.lastIndexOf(sort[right])]
} else if (res < target) {
left ++
} else {
right --
}
}
};