给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != 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
};