题目
给定一个数组,返回其中一组两个元素的和为指定数字的集合
- 通过对象存另一个元素的值,实现遍历一次即可
function towSum(arr, target) {
const temp = {};
for (let i = 0; i < arr.length; i++) {
let other = target - arr[i];
if (temp[other]) {
return [arr[i], other];
}
temp[other] = true;
}
}
//immutable 版本
function towSum(arr, target) {
const dict = Object.fromEntries(arr.map(i=>[i,true]));
return arr.some(i => dict[target - i])
}
//更精简版本
function towSum(arr, target) {
return arr.some(i => arr.includes[target - i])
}
//递归版本
function twoSum(arr,target,set){
if(!arr.length){
return false;
}
const next=arr[0]-target;
return set.contains(next)||twoSum(arr.slice(1),target,new Set([...set,arr[0]]))
}
给定一个数组,返回三个和为0的一组元素
- 通过一个开关,实现双指针左右遍历的方式
function threeSum(nums) {
let start = 0;
let end = nums.length - 1;
let reverse = true;
while (start < end) {
for (let k = start + 1; k < end; k++) {
if (nums[start] + nums[end] + nums[k] === 0) {
return [start, k, end];
}
}
if (reverse) {
start += 1;
} else {
end -= 1;
}
reverse = !reverse;
}
}