面试题:求N个数之和_数据结构


(1)两数之和为0

var twoSum = function(nums, target) {
const maps = {}
const res = []
const len = nums.length

for(let i = 0; i<len; i++){
if(maps[target-nums[i]] !== undefined){
res.push([target-nums[i], nums[i]])
}
maps[nums[i]] = i
}
return res
};

(2)重复的情况

var twoSum = function(nums, target) {
const maps = {}
const res = []
const len = nums.length

for(let i = 0; i<len; i++){
if(maps[target-nums[i]] !== undefined){
res.push([target-nums[i], nums[i]])
}
if(maps[nums[i]]==undefined){
maps[nums[i]] = i
}
}
return res
};

(3)三数之和为0

var threeSum = function(nums, sum) {
let res = []
// 将数组元素排序
nums.sort((a,b) => {
return a-b
})

const len =nums.length

for(let i =0; i<len-2; i++){
let j = i+1
let k = len-1
// 如果有重复数字就跳过
if(i>0&& nums[i]===nums[i-1]){
continue
}
while(j<k){
// 三数之和小于sum,左指针右移
if(nums[i]+nums[j]+nums[k]<sum){
j++
// 处理左指针元素重复的情况
while(j<k&&nums[j]===nums[j-1]){
j++
}
// 三数之和大于sum,右指针左移
}else if(nums[i]+nums[j]+nums[k]>sum){
k--
// 处理右指针元素重复的情况
while(j<k&&nums[k]===nums[k+1]){
k--
}
}else{
// 储存符合条件的结果
res.push([nums[i],nums[j],nums[k]])
j++
k--

while(j<k&&nums[j]===nums[j-1]){
j++
}
while(j<k&&nums[k]===nums[k+1]){
k--
}
}
}
}
return res
};