给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意: 答案中不可以包含重复的三元组
function threeSum(nums: number[]): number[][] {
nums.sort((a,b)=>a-b)
const result: number[][] = [];
//排序后
for(let i=0;i<nums.length;i++){
if(nums[i]>0) break //排序后,说明后面的数都大于零,无答案
//去重:如果当前数字和前一个一样,跳过
if (i > 0 && nums[i] === nums[i - 1]) continue;
let left = i+1
let right = nums.length -1
while(left<right){
const sum = nums[i]+nums[left]+nums[right]
if(sum===0){
result.push([nums[i],nums[left],nums[right]])
//移动指针,如果移动后出现上次的重复数字,再进行移动
while(nums[left]===nums[left+1]) left ++
while(nums[right]===nums[right-1]) right --
left ++
right --
}else if(sum>0){
//说明 right 大了
right --
}else {
left ++
}
}
}
return result
};