/*
* [15] 三数之和
*/
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function (nums) {
nums.sort((a, b) => a - b);
const len = nums.length;
const ans = []
for (let i = 0; i < len; i++) {
const aVal = nums[i];
// 如果第一个数都大于 0 了,说明后面的都大于 0 了,没必要计算了
if (aVal > 0) return ans;
// 去重
if (aVal === nums[i - 1]) continue;
let l = i + 1, r = len - 1;
while (l < r) {
const lVal = nums[l], rVal = nums[r];
const sum = aVal + lVal + rVal;
if (l - 1 > i + 1 && lVal === nums[l - 1]) {
l++;
continue;
}
if (rVal === nums[r + 1]) {
r--;
continue;
}
if (sum === 0) {
ans.push([aVal, lVal, rVal]);
// while (l < r && nums[l] === nums[l + 1]) {
// l++;
// }
// while (l < r && nums[r] === nums[r - 1]) {
// r--
// }
l++;
r--;
} else if (sum > 0) {
r--
} else {
l++
}
}
}
return ans;
};
console.log(threeSum([-1, 0, 1, 2, -1, -4]))