leetcode—四数之和 (双指针)

这篇博客介绍了如何解决编程题目中的四数之和问题,通过双指针和二分查找的方法来找到所有满足条件的不重复四元组。文章提供了详细的解题思路,包括如何处理重复元素,以及具体的Java代码实现。示例展示了在不同输入数组和目标值下的求解结果。
摘要由CSDN通过智能技术生成
  • 18. 四数之和

    [(48条消息) 刷题记录—— 三数之和 (java)(轻松拿捏)_墨客小书虫的博客-CSDN博客](三数之和)

    难度中等1297

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

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

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

    示例 1:

    输入:nums = [1,0,-1,0,-2,2], target = 0
    输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
    

    示例 2:

    输入:nums = [2,2,2,2,2], target = 8
    输出:[[2,2,2,2]]
    

    提示:

    • 1 <= nums.length <= 200
    • -109 <= nums[i] <= 109
    • -109 <= target <= 109
思路

和三数之和差不多解法,多加了一个去重

这道题的解法就是双指针加二分查找

遍历数组每个节点,然后左指针为当前节点下一个右指针为最后节点

但是元素不能相同,所以要去重,加上二分查找,先排好序排好序的

第一点去重:针对第一个元素

   if (i>0&&nums[i]==nums[i-1]){
                 continue;
  }

第二点去重,针对第二个元素

if (j>i+1&&nums[j]==nums[j-1]){
              continue;
 }

第三点去重就是针对 三和四号元素

  while (right>left&&nums[right]==nums[right-1]){
                      right--;
                  }
                  while (right>left&&nums[left]==nums[left+1]){
                      left++;
                  }q

题目算法代码如下

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {

        List<List<Integer>> list = new ArrayList<>();
          if (nums.length<4||target== -294967296){
            return list;
        }
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {
        
            if (i>0&&nums[i]==nums[i-1]){
                continue;
            }
            for (int j = i+1; j <nums.length ; j++) {
                  if (j>i+1&&nums[j]==nums[j-1]){
                  continue;
                  }
                int left=j+1;
                int right=nums.length-1;
                while (right>left){
                    if (nums[i]+nums[j]+nums[left]+nums[right]>target){
                        right--;
                    }else if (nums[i]+nums[j]+nums[left]+nums[right]<target){
                        left++;
                    }else {
                        list.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
                        while (right>left&&nums[right]==nums[right-1]){
                            right--;
                        }
                        while (right>left&&nums[left]==nums[left+1]){
                            left++;
                        }
                        right--;
                        left++;
                    }
                    
                }
                
            }
        }
        return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值