两数之和
大约 2 分钟
两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
双层循环(暴力解法)
function twoSum(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]
}
}
}
排序 双指针移动
function twoSum(nums, target){
const newNums = [...nums].sort((val1, val2) => val1 - val2)
let start = 0
let end = nums.length - 1
// 由于是从小到大的顺序,所以小了就移动左指针,大了移动右指针
while(start < end){
if(newNums[start] + newNums[end] > target) end--
if(newNums[start] + newNums[end] < target) start++
if(newNums[start] + newNums[end] === target) break
}
const res = []
// 找到这两个下标,放到结果中
for(let i = 0; i < nums.length; i++){
if(nums[i] === newNums[start] || nums[i] === newNums[end]) res.push(i)
}
return res
}
hash表
function twoSum(nums, target){
const map = new Map()
for(let i = 0; i < nums.length; i++){
let complate = target - nums[i]
if(map.has(complate)) return [map.get(complate), i]
map.set(nums[i], i)
}
}
另一种hash实现,这种是最常见的写法
var twoSum = function(nums, target) {
// 构造哈希表,存储每一个数
var map = new Map();
for (let i = 0; i < nums.length; i++) {
map.set(nums[i], i);
}
for (let j = 0; j < nums.length; j++) {
let complement = target - nums[j];
// 如果差值在map中存在,返回j和找到的值的下标
if (map.has(complement) && map.get(complement) !== j) {
return [j, map.get(complement)];
}
}
};
indexOf解决方法
function twoSum(nums, target){
let i = nums.length
while(i > 1){
const last = nums[i]
// 利用indexOf直接获取下标
if(nums.indexOf(target-last) > -1) return [nums.indexOf(target-last), i]
i--
}
}