算法学习2 双指针

113 阅读1分钟

1、leetcode 15

var threeSum = function(nums) {
	//存放结果
    let res =[];
    //处理异常
    if(nums.length<3){
        return []
    }
    //先排序
    nums.sort((a,b)=>a-b);
    //先确定一个值 该值循环
    for (let i = 0; i < nums.length; i++) {
    	//因为要求不能重复 所以去重
        if(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];
            //情况1 找到结果
            if(sum==0){
            	//直接push
                res.push([nums[i],nums[left],nums[right]])
                //不能直接break 让左右指针继续移动
                //移动时 left和它的下一个一样 继续往下移
                while(nums[left]==nums[left+1]){
                    left++
                }
                left++
                //右边同理
                while(nums[right]==nums[right-1]){
                    right--;
                }
                right--;
            }else if(sum>0){
            	//情况2 和大于0 右指针向左
                right--
            }else if(sum<0){
            	//情况3 和小于0 左指针向右
                left++
            }
        }        
    }
    return res;
};