前端算法之(四数之和)

101 阅读1分钟

算法---四数之和(leetcode第18题(leetcode.cn/problems/4s…)

image.png 解题思路及代码如下:

/*
* @description: 四数之和
* @params (array) nums 
* @params (number) target 
* @return (array) res 
*/
function fourSum (nums, target) {
    //定义一个结果集
    const res = [];
    const count = nums.length;
    //四数之和,数组至少要有4项,否则直接返回空数组
    if(count < 4) return res;
    //给数组排序
    nums.sort((a, b)=> a - b);
    //开始循环
    for(let i = 0; i < count - 3; i++) {
        //有条件返回,当第一个数大于零且值大于target值的时候,直接返回空数组
        if(nums[i] > 0 && nums[i] > target) {
            return res;
        }
        //给nums[i]去重
        if(i > 0 && nums[i] === nums[i-1]) {
            continue;
        }
        for(let j = i + 1; j < count - 2; j++) {
            //给nums[j]去重
            if(j > i + 1 && nums[j] === nums[j-1]) {
                continue;
            }
            //定义2个指针(left指向j+1项和right指向末尾项)
            let left = j + 1, right = count - 1;
            while(left < right) {
                //定义四数之和(sum),是left和right指针移动的关键指标
                const sum = nums[i] + nums[j] + nums[left] + nums[right];
                if(sum > target) {
                    right--;
                }else if(sum < target) {
                    left++;
                }else {
                    //收集结果
                    res.push([nums[i], nums[j], nums[left], nums[right]]);
                    //给nums[left]去重
                    while(left < right && nums[left] === nums[left + 1]) {
                        left++;
                    } 
                    //给nums[right]去重
                    while(left < right && nums[right] === nums[right - 1]) {
                        right--;
                    }
                    left++;
                    right--;
                }
            }
        }
    }
    return res;
}