Leetcode18四数之和(双指针法)

简介: Leetcode18四数之和(双指针法)

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

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
答题:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[][]}
 */
var fourSum = function (nums, target) {
  let res = []
  if (nums.length < 4) {
    return res
  }
  let len = nums.length;
  nums = nums.sort((a, b) => {
    return a - b
  })
  for (let i = 0; i < len - 1; i++) {

    if (i > 0 && nums[i] === nums[i - 1]) {
      continue
    }
    if (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) {
      return res
    }
    for (let j = len - 1; j > i + 2; j--) {
      if (nums[j] === nums[j + 1]) {
        continue;
      }

      let left = i + 1
      let right = j - 1
      while (left < right) {
        //
        let sum = nums[i] + nums[left] + nums[right] + nums[j]
        if (sum === target) {
          res.push([nums[i], nums[left], nums[right], nums[j]])
          while (left < right && nums[left] === nums[left + 1]) {
            left++
          }
          while (left < right && nums[right] === nums[right - 1]) {
            right--
          }
          left++
          right--
        } else if (sum < target) {
          left++
        } else {
          right--
        }
      }
    }
  }
  return res

};

四数之和跟三数之和挺相似的,都要有一个排序的过程,但是四数之和多了一个右侧边界的收缩。
同时中间两个数字不断地尝试,找到target即可添加到res中。
向右移动左边界的时候,首先计算一下左侧四个数字的和,如果和大于目标选项,直接输出,不用再继续后面的for循环了。
同时由于数字选取不能相同,假设有一个结果第一个数选择了1那么for循环中如果nums[i]就不应该再有1出现了。
举个例子
[2,2,1,2,2]我们选择满足target=5的四个数
在边界左移的过程中会出现
[2,1,2,2]两次但这个明显不符合要求,重复了毕竟
所以函数中要包括选项的去重
于是在第一层for循环第二次for循环以及while循环中都有去重操作
具体打印一下代码,体验整个过程!

相关文章
|
1月前
【LeetCode 16】15.三数之和(双指针法)
【LeetCode 16】15.三数之和(双指针法)
30 1
|
1月前
【LeetCode 03】双指针法总结
【LeetCode 03】双指针法总结
16 0
|
5月前
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
|
5月前
|
算法 数据挖掘 Java
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
|
5月前
|
存储 算法 数据挖掘
【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)
【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)
|
5月前
|
存储 算法 数据可视化
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
|
5月前
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
LeetCode 680.验证回文字符串 Ⅱ(双指针法)
LeetCode 680.验证回文字符串 Ⅱ(双指针法)
85 0
LeetCode 680.验证回文字符串 Ⅱ(双指针法)
LeetCode 633. 平方数之和(双指针法)
LeetCode 633. 平方数之和(双指针法)
88 0
|
算法
LeetCode 88. 合并两个有序数组(双指针法)
LeetCode 88. 合并两个有序数组(双指针法)
92 0