算法挑战32: 四数之和

0 阅读1分钟

题目:

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

思路:

两个for循环,内嵌一个while循环,双指针,加每层优化

代码:

var fourSum = function (nums, target) {
    //前两个数枚举,后两个数双指针
    //排序
    nums.sort((a, b) => a - b);
    let res = [];
    let len = nums.length;
    for (let a = 0; a < len - 3; a++) {
        if (a > 0 && nums[a] === nums[a - 1]) continue;
        //优化一
        if (nums[a] + nums[a + 1] + nums[a + 2] + nums[a + 3] > target) break;
        //优化二
        if (nums[a] + nums[len - 1] + nums[len - 2] + nums[len - 3] < target) continue;

        for (let b = a + 1; b < len - 2; b++) {
            if(b > a+ 1 && nums[b] === nums[b-1])continue;
            //优化一
            if (nums[a] + nums[b] + nums[b + 1] + nums[b + 2] > target) break;
            //优化二
            if (nums[a] + nums[b] + nums[len - 1] + nums[len - 2] < target) continue;
            let c = b + 1;
            let d = len - 1;
            while (c < d) {
                const sum = nums[a] + nums[b] + nums[c] + nums[d];
                if (sum > target) {
                    d--;
                } else if (sum < target) {
                    c++;
                } else {
                    res.push([nums[a], nums[b], nums[c], nums[d]]);
                    c++;
                    while (c < d && nums[c] === nums[c - 1]) {
                        c++;
                    }
                    d--;
                    while (c < d && nums[d] === nums[d + 1]) {
                        d--;
                    }
                }
            }
        }
    }
    return res;
};