
核心思路:
枚举k,将i,j作为两数之和来做i,j分别为k+1和 n-1,记得命中之后去重,没有命中去重与否无所谓。如果 sum<0, 增大i,sum > 0减小j
优化:nums[k] > 0 break
js
/**
* @param {number[]} nums
* @return {number[][]}
*/
// 思路:枚举一个数当作target,剩下两个数做两数之和
var threeSum = function (nums) {
const n = nums.length
const ans = []
nums.sort((a, b) => a - b)
for (let k = 0; k < n; k++) {
// 枚举k
let i = k + 1,
j = n - 1
if (nums[k] === nums[k - 1]) continue
while (i < j) {
const s = nums[i] + nums[j] + nums[k]
if (s === 0) {
ans.push([nums[i], nums[j], nums[k]])
i++
j--
// 命中后去重
while (nums[i] === nums[i - 1]) i++
while (j < n - 1 && nums[j] === nums[j + 1]) j--
} else if (s < 0) {
// s < 0 i增大 s增大
i++
} else j--
}
}
return ans
}