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

[hot100]三数之和

三数之和

附上卡尔大神的讲解

梦破碎的地方!| LeetCode:15.三数之和_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1GW4y127qo/?spm_id_from=333.1391.0.0&vd_source=9eb6e4de48672f76da98b479d4a96f25


题目的大概意思就是从一个数组里面找到三个数值加起来为0的三个数 然后题目要求三元组之间不能重复 但是组内是可以重复的

eg:[-1,-1,2]就是满足条件的三元组 [2,1,-3]也是 但是不能出现两个[-1,-1,2] 三元组内部的数字可以重复

题目要求返回一个二维数组 也就是一个满足条件的三元组数组

这里题目没有要求返回索引 这里就要想到可以排序来提高我们的信息熵 增加信息,

这道题其实细节方面是有点复杂的 难点在于如何确定三个数的信息 上面说排序提高信息 就是让这个数组能够按照一定的顺序排列来提高信息 这里我们要找到a+b+c=0的abc三元组 意味着需要三个变量 这个时候我们就需要联想到双指针加上一个变量 不过经验和想法这东西都还是根据刷题经验以及长期积累来的 所以这题是有一定难度的 这个不太好想 就是三个变量 刚好就是双指针加上一个循环变量

所以a+b+c就可以拆解成 固定a 让b+c=-a 这里的a就是每一步循环遍历循环的i,然后b和c就是两头的双指针

所以思路就是遍历nums数组 让a固定 然后b指向i下一个 c指向末尾

然后根据三者之间的和来收缩指针 这里为什么能够根据三者之和来收缩指针呢 因为我们的这个数组是带有信息的 也就是排序过的 这也就是为什么我们上面要先把数组排列然后再遍历

根据sum来判断两个指针如何来移动 如果sum<0 这个时候说明数小了 就把左边的指针往右移动 让它数值大一些

如果sum>0 说明数大了 就把右边的指针往左移动 让它数值小一些

如果=0 这个时候说明当前的i b c 就是我们想要寻找的三元组 我们就可以把它add进list 然后同时收缩两个指针 但是我们这个时候需要注意的是题目要求我们不能有重复的三元组 所以需要去重 这个时候我们就要去重 要对 i b c都要去重

对i用nums[i]==nums[i-1]来判断是否重复

注意这里为什么不能是nums[i]==nums[i+1]

因为left指针就是i+1 也就是i前面一位

如果用这个来判断的话就是来判断一个数组里面是否有重复的了

eg:

这个情况下 i 和left指向的就是相等的 但是这个是符合条件的 因为nums[i]==nums[i+1]这个本质就是用i和left指向的来做比较 但是i和left是可以进行比较的

所以只能用nums[i]==nums[i-1]

同理用nums[left]==nums[left-1]

和nums[right]==nums[right+1]

来进行去重 这里的right就是要去和右边的比了 因为左边 也就是right-1可能是left 但是left可以等于right

还可以对代码进行一个剪枝 也就是当i指向的元素都大于0的情况下 可以直接返回list数组了 因为left和right指向的都大于i指向的 这个时候后续移动三者不可能三者相加等于0 所以可以直接返回 这里根据排序之后和位置关系得出的条件是

nums[i]<=nums[left]<=nums[right]

if nums[i]>0

nums[i]+nums[left]+nums[right] !=0

所以直接返回之前找到的三元组即可

但是这里一定要注意的是返回不能写成 new Arraylist 因为这个返回的是一个空数组 没有返回到有数组的list

import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String s = input.nextLine(); String[] split = s.split(" "); int [] arr=new int[split.length]; for (int i = 0; i < split.length; i++) { arr[i]=Integer.parseInt(split[i]); } List<List<Integer>> lists = threeSum(arr); for (int i = 0; i < lists.size(); i++) { System.out.println(lists.get(i)); } } public static List<List<Integer>> threeSum(int[] nums) { //先对nums进行排序 Arrays.sort(nums); //然后在开始循环遍历nums ArrayList<List<Integer>> list = new ArrayList<>(); for (int i = 0; i < nums.length; i++) { //剪枝 如果到了i这里数值开始大于0了 后面的left和right肯定也是大于0的 这三者后面的和肯定不会为0 //所以可以直接返回 if(nums[i] > 0){ return list; } //对i进行去重 if(i>0&&nums[i]==nums[i-1]){ continue; } //定义两个指针 放在后续数组的两段 int left=i+1; int right=nums.length-1; while(left<right){ int sum=nums[i]+nums[left]+nums[right]; if(sum==0){ list.add(Arrays.asList(nums[i],nums[left],nums[right])); //移动双指针 left++; right--; //对两个指针进行去重 while(left<right&&nums[left]==nums[left-1]){ left++; } while(left<right&&nums[right]==nums[right+1]){ right--; } }else if(sum>0){ right--; }else{ left++; } } } return list; } }

如果有什么问题可以评论区一起讨论一下 如果觉得写的还可以点个赞鼓励一下谢谢

http://www.jsqmd.com/news/1106603/

相关文章:

  • IoT物联网-时序数据库
  • (干货满满) Model Context Protocol(MCP) 完全指南从入门到精通,构建 AI 与外部世界的桥梁
  • 【毕业设计】基于 SpringBoot 的校园拾遗寻物互助系统的设计与实现 基于 SpringBoot 的大学生失物登记认领系统(源码+文档+远程调试,全bao定制等)
  • 如何5分钟搞定Windows和Office永久激活:一站式智能激活解决方案指南
  • 通用汽车底特律工厂裁员千余人,机器人替代人工背后是成本与效率的博弈
  • Codex 中转站怎么配置?Node.js + Codex + CC Switch 完整教程
  • 原来DNS这么简单!全网最通俗的BIND配置教程(附主从复制)
  • MIC-3392A2单板计算机
  • 我用 AI 做电商图踩过的 7 个坑,每个都是真金白银买来的
  • 国产IM下一城:混合办公的性能与合规平衡术
  • 为什么深度学习离不开矩阵计算?一篇看懂向量化与 Batch
  • Linux多线程--cleanup push/pop
  • Java毕业设计-基于 Java 的医院医疗设备管理系统的设计与实现 基于 Java 的医院医疗器械资产管控系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • idea卡顿 idea设置了Maximum Heap Size 但current value还是小值
  • 基于全域场介质扰动的光传播机理新模型研究
  • Claude Code内置隐藏木马近3个月,官方回滚难消中国用户信任危机
  • 学生会议记录软件帮你记录更快更准整理更省心
  • 当AI写出百万行代码:金融科技的下一站是“可控智能”
  • 有哪些适合硕士、从开题至定稿的一体化 AI 写作工具推荐?
  • TLS Connect 如何解决了关于证书有效期缩短的问题?
  • 想要找性价比合适的亮片胶,这几家口碑过硬的生产厂家推荐给你
  • 【Python工程化实战】变异测试(Mutation Testing):mutmut 验证测试套件有效性
  • Java毕业设计-基于 Java Web 的茶园文化宣传交流平台的设计与实现 基于 Java Web 的茶园茶农文化交流平台的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • Metasploit实战指南:从工具使用到渗透测试思维框架构建
  • 可以出具软件测试报告的第三方软件测评机构推荐
  • 编程知识点讲解怎么录屏?程序员高质量技术教学录屏避坑指南
  • TEMPO GALIL CC903-61531运动接口模块
  • Yaskawa XU-ACP130-B11晶圆预对准器
  • Java计算机毕设之基于 Java 的在线学术文献收纳检索系统的设计与实现 基于 Java 的电子书目文献资源管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 【实战分享】.NET 10 + ABP WebAPI 项目发布部署至 Docker Desktop 避坑与实践记录