双指针:三数之和+四数之和

 

目录

题目链接:三数之和

思路分析:排序+双指针

细节处理

画图解析

代码

题目链接:四数之和

思路分析: 排序+双指针

细节处理 

画图解析

代码


题目链接:三数之和

双指针:三数之和+四数之和_第1张图片

思路分析:排序+双指针

  1. 排序
  2. 依次固定一个数a
  3. 在该数后面的区间内,利用“双指针算法”快速找到两个数的和等于-a即可

细节处理

1.去重

找到一个符合的结果后,left和right指针要跳过重复的元素

当使用完一次双指针算法后,a也需要跳过重复的元素

2.不漏

找到一种结果后,不要“停”,要缩小区间,继续往下寻找

3.小改进

如果a大于0,那么之后的数相加不可能为0(因为前面已经排序了),所以如果a大于0就可以直接break

画图解析

双指针:三数之和+四数之和_第2张图片 

代码

public List> threeSum(int[] nums) {
        Arrays.sort(nums);
        List> ret=new ArrayList<>();
        int n= nums.length;
        for (int i = 0; i < n; ) {
        //小改进
            if(nums[i]>0){
                break;
            }
            int left=i+1,right=n-1,flag=-nums[i];
            while (leftflag){
                    right--;
                } else if (sum(Arrays.asList(nums[i],nums[left],nums[right])));
                    //不漏
                    left++;
                    right--;
                    //去重
                    while (left

题目链接:四数之和

思路分析: 排序+双指针

  1. 排序
  2. 依次固定一个数a
  3. 在a后面的区间内,利用“三数之和”找到三个数,使这三个数的和等于target-a即可
  4. 依次固定一个数b
  5. 在b后面的区间内,利用“双指针”找到两个数,使这两个数的和等于target-a-b即可

细节处理 

1.去重

找到一个符合的结果后,left和right指针要跳过重复的元素

当使用完一次双指针算法后,a也需要跳过重复的元素

当使用完一次双指针算法后,b也需要跳过重复的元素

2.不漏

找到一种结果后,不要“停”,要缩小区间,继续往下寻找

画图解析

双指针:三数之和+四数之和_第3张图片

代码

 public List> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List> ret=new ArrayList<>();
        int n= nums.length;
        for (int i = 0; i flag){
                        right--;
                    } else if (sum(Arrays.asList(nums[i],nums[j],nums[left],nums[right])));
                        //不漏
                        left++;
                        right--;
                        //去重
                        while (left

 

本文内容到此结束了,
如有收获欢迎点赞收藏关注✔️,您的鼓励是我最大的动力。
如有错误疑问欢迎各位指出。
主页:发呆的百香果子_spring,软件测试-CSDN博客

求同存异,与光同尘‍‍

你可能感兴趣的:(java,后端,数据结构,算法)