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

Leetcode面试经典150题-15.三数之和

解法都在代码里,不懂就留言或者私信

class Solution {/**每次做这个题都想着这事最后一次了,但是确实很高频,还是多练练吧基本思路:先把原来的数组按照从小到大的顺序排列,然后我们从头开始确定第一个数,然后从它后面的数里确定第二个数和第三个数寻找第二和第三个数使用双指针,left和right分别指向后面区间第一个和最后一个位置,如果后面两个数的和小于了第一个数的相反数则left右移,如果等于记录答案left和right同时移动,如果大于right左右,左移右移的过程中要注意如果当前数和上个尝试的数一样比如left和left-1,right和right+1,就直接跳过如果第一个数大于0了,停止,因为它后面的数都大于等于它,它都大于0了,后面不可能存在和它加一起等于0的两个数 */public List<List<Integer>> threeSum(int[] nums) {/**先定义结果list */List<List<Integer>> ans = new ArrayList<>();/**给数组排个序,默认按照从小到大排序*/Arrays.sort(nums);/**这里可以判断一下如果第一个数大于0,直接返回空的,但是也可以不用这样,遍历的过程中也可以判断这里注意firstNum的范围是<nums.length - 2,因为你总要给后面留两个数吧*/for(int firstNum = 0;   firstNum <nums.length - 2; firstNum++) {if(nums[firstNum] > 0) {break;}/**如果当前数不是第一个数并且和上个数相等,直接忽略 */if(firstNum != 0 && nums[firstNum] == nums[firstNum - 1]) {continue;}int left = firstNum + 1;int right = nums.length - 1;int target = -nums[firstNum];/**这里一定要写小于,因为他们两个不能相等 */while(left < right) {if(nums[left] + nums[right] < target) {left ++;} else if(nums[left] + nums[right] > target) {right --;} else {/**如果left是我们考虑范围的第一个数字或者它和上个数不相等,收集答案如果不是第一个数并且和上个数相等,其实就是执行left++, right--为什么不判断right位置呢? 因为left和right凑够了target这个和,如果left位置和left-1相等那right和right+1也必然相等,不管我们搜集不收集答案,都要执行left++, right--的操作所以提取到最后省略else的部分*/if(left == firstNum + 1 || nums[left] != nums[left-1]) {List<Integer> curList = new ArrayList<>();curList.add(nums[firstNum]);curList.add(nums[left]);curList.add(nums[right]);ans.add(curList);}left ++;right --;}}}return ans;}
}

运行结果,不算特别满意,这应该是最优解了

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 故障诊断 | GNN图神经网络故障诊断(Python)
  • 用QTdesigner制作自己的双目标定软件
  • Java常用API第二篇
  • llama3 结构详解
  • Upload-Lab第12关:如何巧妙利用%00截断法绕过上传验证
  • linux 改文件夹所有者
  • Git工具练习网站
  • 【k8s从节点报错】error: You must be logged in to the server (Unauthorized)
  • Oracle RAC vs Clusterware vs ASM
  • 【Linux系列】telnet使用入门
  • 基于Mybatis 数据过滤组件(二) - 使用文档
  • web技术1——http详解(重要)
  • 兼容并蓄,高效集成:EasyCVR视频综合接入能力助力多元化项目需求
  • Fragment学习笔记
  • 数组前缀和算法技巧
  • [PHP内核探索]PHP中的哈希表
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 10个确保微服务与容器安全的最佳实践
  • css系列之关于字体的事
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • javascript从右向左截取指定位数字符的3种方法
  • MySQL数据库运维之数据恢复
  • scrapy学习之路4(itemloder的使用)
  • spark本地环境的搭建到运行第一个spark程序
  • Spring-boot 启动时碰到的错误
  • Theano - 导数
  • 对JS继承的一点思考
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 基于HAProxy的高性能缓存服务器nuster
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端之Sass/Scss实战笔记
  • 通过git安装npm私有模块
  • 推荐一个React的管理后台框架
  • 一天一个设计模式之JS实现——适配器模式
  • 正则学习笔记
  • #define与typedef区别
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (03)光刻——半导体电路的绘制
  • (day6) 319. 灯泡开关
  • (Note)C++中的继承方式
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (七)glDrawArry绘制
  • (转)http-server应用
  • (转)Oracle 9i 数据库设计指引全集(1)
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET MVC第五章、模型绑定获取表单数据
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [].slice.call()将类数组转化为真正的数组
  • [20181219]script使用小技巧.txt