算法8.0

18. 四数之和 - 力扣(LeetCode)

这道题目和三数之和差不多 重点还是二数之和三数之和的理解

解法一:

依旧暴力解法 排序+暴力枚举+利用ser去重 (这个解决法绝对超时)

解法二:

排序+双指针(三数之和)

依次固定一个数a 在a后面的区间内,利用三数之和找到三个数 使三个数的和等于target-a即可

细节问题:不重不漏 (和三数之和那里是一样的)

合理的预期:这道题的难度 半天都不为过

下面是效果图和代码:

java 复制代码
class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        
        //定义一个结果数组
        List<List<Integer>> ret = new ArrayList<>();
        //排序
        Arrays.sort(nums);
        
        int n = nums.length; 
        
        //固定一个数a
        for(int i = 0;i<n;){
            //if(nums[i]>0) break; //小小的优化
            //int target01 = -nums[i];

            //****************************************************************************** */          //三数之和
            for(int j =i+1;j<n;){//固定数b 注意上面已经用过了i  所以这里要用其他的变量 
               long target02 = (long)target-nums[i]-nums[j];//数据太大可能溢出  用long 还要注意强制类型转换
               int left= j+1,right =n-1;
               
               //if(nums[j]>0) break; //小小的优化

               while(left<right){
                int sum = nums[left]+nums[right];//sum要在while循环内部  要不sum不更新
                if(sum>target02) right--;
                else if(sum<target02) left++;
                else{
                  ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[j],nums[left],nums[right])));

                //去重一
                  while(left<right && nums[left]==nums[left-1]) left++; 
                  while(left<right && nums[right]==nums[right+1]) right--;

                //继续缩小空间查找
                  left++;//熟练之后 可以写到上面ret开头的语句里面  
                  right--;
                }

               }
               //去重二
                j++;
                while(j<n-1 &&nums[j-1]==nums[j]) j++;
            }
            //******************************************************************************************* */
           //去重三
            i++;
            while(i<n &&nums[i-1]==nums[i]) i++;
             //ret.add(new ArrayList<Integer>(Arrays.asList(nums[i])));
        }
        return ret;
    }
}
//xiyu20251013&1#1*8

//提交数组的时候  直接交4个
//要注意题目已经定义了target这个结果数
/*去重操作还是差点火候  先去重还是先缩小空间?
  先移动指针 不能保证left<right  所以先去重 再缩小空间 力扣上面的测试不够狠 要不这个隐患是会出现  的*/

三数之和的复习:

List<List<Integer>> ret = new ArrayList<>();

ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));

关于去重操作:

先去重还是先缩小空间? 越界风险(left不一定就是小于right了) 可能漏解

while(left<right && nums[left]==nums[left+1]) left++; //注意越界异常

这里的left小于right保证了数组没有越界异常

i++; while(i<n &&nums[i-1]==nums[i]) i++;

为什么需要i++呢 先往前走一步 再回头看看是不是重复了

数组越界异常不是只有超出数组

双指针专题完结![烟花][烟花][烟花]

感谢大家的支持

更多内容还在加载中...........

如有问题欢迎批评指正,祝大家生活愉快、学习顺利!!!

相关推荐
C雨后彩虹5 小时前
任务最优调度
java·数据结构·算法·华为·面试
少林码僧7 小时前
2.31 机器学习神器项目实战:如何在真实项目中应用XGBoost等算法
人工智能·python·算法·机器学习·ai·数据挖掘
钱彬 (Qian Bin)7 小时前
项目实践15—全球证件智能识别系统(切换为Qwen3-VL-8B-Instruct图文多模态大模型)
人工智能·算法·机器学习·多模态·全球证件识别
Niuguangshuo8 小时前
EM算法详解:解密“鸡生蛋“的机器学习困局
算法·机器学习·概率论
a3158238068 小时前
Android 大图显示策略优化显示(一)
android·算法·图片加载·大图片
一条大祥脚8 小时前
26.1.9 轮廓线dp 状压最短路 构造
数据结构·c++·算法
鲨莎分不晴8 小时前
反向传播的数学本质:链式法则与动态规划的完美共舞
算法·动态规划
sonadorje8 小时前
逻辑回归中的条件概率
算法·机器学习·逻辑回归
cici158748 小时前
基于Pan-Tompkins算法的ECG信号HRV提取方案
算法
McGrady-1759 小时前
拓扑导航 vs 几何导航的具体实现位置
算法