当前位置: 首页 > news >正文

算法8.0

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

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

解法一:

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

解法二:

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

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

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

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

下面是效果图和代码:

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {//定义一个结果数组List<List<Integer>> ret = new ArrayList<>();//排序Arrays.sort(nums);int n = nums.length; //固定一个数afor(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++呢  先往前走一步 再回头看看是不是重复了  

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

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

感谢大家的支持

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

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

http://www.dtcms.com/a/478579.html

相关文章:

  • 网站左侧导航栏设计一个网站的建设要经过哪几个阶段
  • Java-Linux环境下查看JDK安装路径
  • 嘉立创学习
  • QML学习笔记(三十四)QML的GroupBox、RadioButton
  • AI Agent 的技术架构、产业赋能与治理挑战研究 —— 基于 2024-2025 年技术突破与应用实践的分析
  • 设计美观网站有哪些辽宁网站建设价位
  • vtkFillHolesFilter——3D网格补孔的“一键修复”工具,从原理到避坑
  • 网站建设完整代码深圳开公司流程及费用
  • Vue3为什么选择用Vite?使用指南与优势解析
  • 【STL】set容器(2336.无限集中的最小数字)
  • 第一章 计算机系统概论1
  • Cannot invoke “String.length()“ because “<parameter1>“ is null
  • H5使用环信实现视频或语音通话
  • SMTPman高效稳定的smtp服务器使用指南解析
  • 《Qt应用开发》笔记p3
  • Java-148 深入浅出 MongoDB 聚合操作:$match、$group、$project、$sort 全面解析 Pipeline 实例详解与性能优化
  • Oops 概念
  • 用老域名做新网站 权重怎么传递哈尔滨网站建设公司哪家好
  • Servlet内存马
  • 为什么要使用反射举例
  • python开发生态及学习路线和应用领域都有哪些
  • bk7258 交叉编译libzip-1.11.4
  • 汽车级mosfet的应用场景
  • 手机做ppt的免费模板下载网站深圳自适应网站的公司
  • svn 库 co 下来有白叉
  • Windows安全狗安装教程
  • 深度解析:OpenCASCADE 中平面闭合轮廓的离散点提取
  • 河源盛世网站建设丽水市建设监理协会网站在哪里
  • 衡阳做网站建设的公司在哪里查关键词排名
  • linux学习笔记(30)网络编程——TCP协议详解