15.三数之和,使用双指针

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    let length = nums.length;
    let res=[];
    // 排序
    nums.sort((a,b)=>a-b);
    
    for(let i=0;i<length-2;i++){
        // 处理数组中相邻两个元素重复的问题
        if (i>0 && nums[i]==nums[i-1]){
            continue;
        }

        // 使用双指针,寻找两个元素之和等于-nums[i]
        let target=-nums[i];
        let left = i+1;
        let right = length-1;
        if(nums[i]>0)break;
        while(left<right){
            let sum=nums[left]+nums[right];
            // 1.符合要求的情况
            if (sum==target){
                // 找到的第一种结果
                res.push([nums[i],nums[left],nums[right]]);
                // 注意数组res里面放着很多个数组
                // 接着便利双指针,处理元素重复的问题
                while(left<right && nums[left]==nums[left+1]){
                    left++;
                }
                while(left<right && nums[right]===nums[right-1]){
                    right--;
                }
                
                left++;
                right--;
                
            }
            // 2.sum<target
            else if(sum<target){
                left++;
            }
            // 3.sum>target
            else{
                right --;
            }
        }        
    }
    return res;

};