Published
Edited
Aug 22, 2020
三数之和
尾递归
Insert cell
md`# 三数之和`
Insert cell
md`三数之和</br>
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。`
Insert cell
md`给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]`
Insert cell
md`实现参考:https://www.geekxh.com/1.0.%E6%95%B0%E7%BB%84%E7%B3%BB%E5%88%97/008.html#_01%E3%80%81%E9%A2%98%E7%9B%AE%E7%A4%BA%E4%BE%8B`
Insert cell
md`js实现`
Insert cell
{
const nums = [-1, 0, 1, 2, -1, -4];
const target = 0;

// 排序
const arr = nums.sort((a,b)=>{
return a-b;
});

const sum = (...nums)=>{
return nums.reduce((pre,cur)=>{
return pre+cur;
},0);
}

// 每次循环时移动left和right指针
const compute = (cur,left,right,result)=>{
// 这种情况需要直接返回
if(left === right){
return;
}
const total = sum(arr[cur],arr[left],arr[right]);
if(total === target){
result.push([arr[cur],arr[left],arr[right]]);
return;
}
if(total < target){
compute(cur,left+1,right,result)
}else{
compute(cur,left,right-1,result)
}
}


let cur;
let left;
let right;
const result = [];
// 循环,标注i为当前
for(let i=0,len=arr.length;i<len-2;i++){
cur = i;
left = i+1;
right = len-1;
// 这种情况可以直接返回
if(arr[cur]>target){
return;
}
compute(cur,left,right,result);
}
return result;
}
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more