思路:
1.给数组排序
2.遍历数组从0遍历到length - 2
防止下标越界,也是优化算法
3.如果当前的数字等于前一个数字,则跳过这个数
避免结果重复
4.如果数字不同,则设置start = i+1,end = length - 1,查看i,start和end三个数的和比零大还是小如果比0小那么start++,如果比0大,end--,如果等于零把这三个数都加入结果
5.返回结果
该题的难点就是去重,不仅需要在for循环开始时进行去重
i === 0 || nums[i] !== nums[i - 1]
还要在加入结果时去重
while (nums[start] === nums[start - 1] && start < end) {
start++;
}
while (nums[end] === nums[end + 1] && start < end) {
end--;
}
const threeSum = nums => {
const result = [];
nums.sort((a, b) => a - b);
for (let i = 0; i < nums.length - 2; i++) {
if (i === 0 || nums[i] !== nums[i - 1]) {
let start = i + 1,
end = nums.length - 1;
while (start < end) {
if (nums[i] + nums[start] + nums[end] === 0) {
result.push([nums[i], nums[start], nums[end]]);
start++;
end--;
while (nums[start] === nums[start - 1] && start < end) start++;
while (nums[end] === nums[end + 1] && start < end) end--;
} else if (nums[i] + nums[start] + nums[end] < 0) start++;
else end--;
}
}
}
return result;
};