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

(LeetCode 面试经典 150 题 ) 15. 三数之和 (排序+双指针)

题目:15. 三数之和

在这里插入图片描述
在这里插入图片描述

思路:排序+双指针,时间复杂度0(n^2+nlogn)。

先将数组nums升序排序,方便去重和使用双指针。第一层for循环来枚举第一位数,后面使用双指针来找到第二个、第三个数即可,细节看注释。

C++版本:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {// 先将数组nums升序排序,方便去重和使用双指针int n=nums.size();sort(nums.begin(),nums.end());// 答案vector<vector<int>> v;// 遍历第一个数for(int i=0;i<n-2;i++){// 如果和前一个数重复,跳过if(i!=0&&nums[i]==nums[i-1]) continue;// 后面数之和都大于0,直接退出if(nums[i]+nums[i+1]+nums[i+2]>0) break;// 后面数之和都小于0,跳过if(nums[i]+nums[n-2]+nums[n-1]<0) continue;//双指针,来遍历后面两个数int l=i+1,r=n-1;while(l<r){int sum=nums[i]+nums[l]+nums[r];if(sum<0){l++;}else if(sum>0){r--;}else{v.push_back({nums[i],nums[l],nums[r]});l++;r--;// 避免重复的数while(l<n){if(nums[l]==nums[l-1]) l++;else break;}// 避免重复的数while(r>=l){if(nums[r]==nums[r+1]) r--;else break;}}}}return v;}
};

JAVA版本:

class Solution {public List<List<Integer>> threeSum(int[] nums) {int n=nums.length;Arrays.sort(nums);List<List<Integer>> v=new ArrayList<>();for(int i=0;i<n-2;i++){if(i!=0&&nums[i]==nums[i-1]) continue;if(nums[i]+nums[i+1]+nums[i+2]>0) break;if(nums[i]+nums[n-2]+nums[n-1]<0) continue;int l=i+1,r=n-1;while(l<r){int sum=nums[i]+nums[l]+nums[r];if(sum<0){l++;}else if(sum>0){r--;}else{v.add(Arrays.asList(nums[i],nums[l],nums[r]));l++;r--;while(l<n){if(nums[l]==nums[l-1]) l++;else break;}while(r>=l){if(nums[r]==nums[r+1]) r--;else break;}}}}return v;}
}

GO版本:

func threeSum(nums []int) [][]int {n:=len(nums)slices.Sort(nums)v:=[][]int{}for i:=0;i<n-2;i++ {if i!=0 && nums[i]==nums[i-1] {continue}if nums[i]+nums[i+1]+nums[i+2]>0 {break}if nums[i]+nums[n-2]+nums[n-1] <0 {continue}l,r:=i+1,n-1for l<r {sum:=nums[i]+nums[l]+nums[r]if sum<0 {l++}else if sum>0 {r--}else{v=append(v,[]int{nums[i],nums[l],nums[r]})l++r--for l<r {if nums[l]!=nums[l-1] {break}l++}for l<r {if nums[r]!=nums[r+1] {break}r--}}}}return v
}
http://www.dtcms.com/a/274815.html

相关文章:

  • UML 图类型全解析:结构图与行为图分类详解
  • 拼多多电商运营技巧---补坑产经验
  • 软件测试(白盒测试)
  • 用FunctionCall实现文件解析(二):创建单例客户端
  • 2025亚太中文赛项 B题疾病的预测与大数据分析保姆级教程思路分析
  • JVM方法区的运行时常量区到底存储哪些数据?
  • 【南金研CAN数采仪助力福田祥菱 QEV车型售后问题处理
  • 制作 ext4 文件系统
  • java 导入利用布隆BloomFilter
  • SSE事件流简单示例
  • Paimon 写入磁盘文件名字生成机制
  • 2025年NSSCTF-青海民族大学 2025 新生赛WP
  • 学习C++、QT---20(C++的常用的4种信号与槽、自定义信号与槽的讲解)
  • 动力系统模拟与推导-AI云计算数值分析和代码验证
  • BLE低功耗设计:从广播模式到连接参数优化的全链路分析与真题解析
  • Django母婴商城项目实践(一)
  • 【JMeter】接口加密
  • 蜗轮丝杆升降机拆装图
  • 在多个DHCP服务器的网络环境中选择指定的DHCP服务
  • Windows GNU Radio避坑
  • 深入探究编程拷贝
  • mysql的性能优化:组提交、数据页复用、全表扫描优化、刷脏页
  • Vue 表单开发避坑指南:从响应式数据到动态规则的实践总结
  • Go 编译报错排查:vendor/golang.org/x/crypto/cryptobyte/asn1 no Go source files
  • Java外包怎么选?这几点不注意,项目可能血亏!
  • day21——特殊文件:XML、Properties、以及日志框架
  • Linux中geoserver中文乱码
  • 离线环境二进制安装docker
  • uniapp获取状态栏高度,胶囊按钮的高度,底部安全区域的高度,自定义导航栏
  • [实战]调频三角波和锯齿波信号生成(完整C代码)