18. 四数之和 JavaScript实现

120 阅读1分钟

18. 四数之和

image.png

var fourSum = function(nums, target) {
    // 长度是常数
    const n = nums.length;
    let result = [];


    // 当元素少于4的时候,返回空
    if(nums == null || n < 4) return result;

    // 元素进行升序排列,这样可以根据相加结果进行移动.注意js中sort的写法
    nums.sort((a,b) => a - b);

 
    // 固定指针i,j在最左边,最小的两块。然后移动指针L,R在j+1, n-1的位置。
    // 两个固定指针,所以两层循环
    for(let i=0;i<n;i++){
        // 进行第一次去重操作,判断i当前元素是否重复。重复就结束这次循环,开启下一次循环。
        if (i > 0 && nums[i] == nums[i-1]) continue;

        for(let j=i+1; j<n; j++){
            // 注意这里是j>i+1,即检查之前的元素,向后看。只是j>1是不行的。
            if (j>i+1 && nums[j] == nums[j-1]) continue;
        
            let L = j + 1;
            let R = n - 1;

            while(L < R){
                const sum = nums[i] + nums[j] + nums[L] + nums[R];
                // 和为0时
                if(sum-target == 0){
                    result.push([nums[i],nums[j],nums[L],nums[R]]);

                    // 第二次去重操作。当和为0的时候,防止L和R的重复元素出现
                    while(L < R && nums[L] == nums[L+1]) L++;
                    while(L < R && nums[R] == nums[R-1]) R--;

                    // 和为0,移动L和R指针
                    L++;
                    R--;
                }
                // 和不为0,移动L和R,使得和为0.
                // 大于0,代表大于0的值太大了,需要调小
                else if(sum-target > 0) R--;
                else if(sum-target < 0) L++;
            }
        }
    }
    return result;
};