每天一道leetcode(Day 33)


18. 四数之和

题目描述

给定一个包含  n 个整数的数组  nums  和一个目标值  target,判断  nums  中是否存在四个元素 a,b,c  和 d ,使得  a + b + c + d  的值与  target  相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]

解题思路

同三数之和的解法,利用双指针,需要注意的是要排除相同的选项。

代码

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[][]}
 */
var fourSum = function (nums, target) {
  let res = [];
  if (nums.length < 4) return res;
  const newNums = nums.sort((a, b) => a - b);
  const len = nums.length;
  for (let i = 0; i < len - 3; i++) {
    // 去重
    if (i > 0 && newNums[i] === newNums[i - 1]) continue;
    for (let j = i + 1; j < len - 2; j++) {
      let left = j + 1,
        right = len - 1;
      // 去重
      if (j - 1 > i && newNums[j] === nums[j - 1]) continue;
      while (left < right) {
        const sum = newNums[i] + newNums[j] + newNums[left] + newNums[right];
        if (sum === target) {
          res.push([newNums[i], newNums[j], newNums[left], newNums[right]]);
          while (left < right && newNums[left] === newNums[left + 1]) {
            left++;
          }
          while (left < right && newNums[right] === newNums[right - 1]) {
            right--;
          }
          left++;
          right--;
        } else {
          sum > target ? right-- : left++;
        }
      }
    }
  }
  return res;
};

参考

18. 四数之和


文章作者: CassielLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 CassielLee !
评论
  目录