news 2026/7/29 23:36:03

hot100 15.三数之和

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
hot100 15.三数之和

一、思路:

1.为方便双指针以及跳过相同元素,先把nums排序。

2.枚举nums[i],将问题转化成nums[j] + nums[k] = -nums[i],转变成两数之和的问题。

3.题目要求答案中不能有重复的三元组,因此要避免重复。

(1)在外层循环中,如果发现nums[i] = nums[i - 1],那么nums[i]与后面两个数组成的和为0的三元组,nums[i - 1]也能组成一模一样的三元组,这就重复了。所以遇到nums[i] = nums[i - 1]的情况,直接continue。

(2)在内层循环中,当三数之和等于0时,为避免把相同的三元组计入答案,跳过后续相同的nums[j]和nums[k](也可以只跳过相同的nums[j])。

二、优化:

1.优化一:如果nums[i]与后面最小的两个数相加nums[i] + nums[i + 1] + nums[i + 2] > 0,那么后面不可能存在三数之和等于0,break外层循环(终止循环,执行循环后面的代码)。

2.优化二:如果nums[i]与后面最大的两个数相加nums[i] + nums[n - 2] + nums[n - 1] < 0,那么内层循环不可能存在三数之和等于0,但继续枚举,nums[i]可以变大,所以后面还有机会找到三数之和等于0,continue外层循环(跳过本次迭代,进入下一次循环迭代)。

三、复杂度分析:

1.时间复杂度:O(n^2),其中n为nums的长度。排序O(logn),外层循环枚举第一个数,做法是O(n)双指针,所以总的时间复杂度为O(n^2)。

2.空间复杂度:O(1)。

附代码:

class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer>> res = new ArrayList<>(); int n = nums.length; for(int i = 0;i < n - 2;i++){ int x = nums[i]; if(i > 0 && x == nums[i - 1]){ //跳过重复数字 continue; } if(x + nums[i + 1] + nums[i + 2] > 0){ //优化1 break; } if(x + nums[n - 2] + nums[n - 1] < 0){ //优化2 continue; } int j = i + 1; int k = n - 1; while(j < k){ int sum = x + nums[j] + nums[k]; if(sum > 0){ k--; }else if(sum < 0){ j++; }else{ //三数之和为0 res.add(List.of(x,nums[j],nums[k])); //数组已经排序,相同的数字会相邻,需跳过重复数字 j++; k--; //跳过重复数字 while(j < k && nums[j] == nums[j - 1]){ j++; } //跳过重复数字 while(k > j && nums[k] == nums[k + 1]){ k--; } } } } return res; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 22:21:12

15人团队,60天,1000万美金ARR:Lovable正在重新定义“软件开发”

image.png大家好&#xff0c;我是01。最近看了一期Lennys Podcast&#xff0c;嘉宾是Lovable的创始人Anton Osika。Lovable这家瑞典AI初创公司&#xff0c;创造了一个在欧洲创业圈前所未有的增长神话&#xff1a;15个人的团队&#xff0c;在产品发布后的60天内&#xff0c;就做…

作者头像 李华
网站建设 2026/7/28 19:48:24

TensorFlow调试报错看不懂?LobeChat帮你解读

TensorFlow调试报错看不懂&#xff1f;LobeChat帮你解读 在训练一个图像分类模型时&#xff0c;你是否曾被控制台里突然弹出的一长串红色错误信息搞得一头雾水&#xff1f;比如这条&#xff1a; InvalidArgumentError: Incompatible shapes: [32,64] vs [64,32][[node MatMul…

作者头像 李华
网站建设 2026/7/25 4:14:53

2026届秋招AI岗位狂潮:大厂招聘激增10倍,这份成功上岸攻略不容错过!

2025年夏末&#xff0c;一场针对2026届毕业生的AI人才争夺战比往年提前了至少一个月打响。阿里巴巴、腾讯、字节跳动、百度等头部企业纷纷抛出规模空前的招聘计划&#xff0c;其中AI相关岗位占比普遍超过60%&#xff0c;部分业务线甚至高达80%至90%。 一场前所未有的秋招正在拉…

作者头像 李华
网站建设 2026/7/28 5:42:11

1、掌握 Linux 脚本编程:从基础到高级应用

掌握 Linux 脚本编程:从基础到高级应用 1. 技术要求与 Linux 外壳类型 在开始学习脚本编程之前,了解技术要求和不同类型的 Linux 外壳是很重要的。技术要求通常涉及到对一些基本 Linux 命令的熟悉,如 ls 、 cd 和 which 等。而 Linux 有多种外壳,常见的有 Sh 外壳…

作者头像 李华
网站建设 2026/7/25 12:16:15

3、Bash脚本编写:基础与进阶

Bash脚本编写:基础与进阶 1. 带参数运行脚本 在Bash脚本中,我们可以带参数运行脚本。即便脚本未使用这些参数,它们也会被默默忽略。例如运行 hello1.sh 脚本并传入一个参数: $ hello1.sh fred脚本仍会正常运行且不报错,输出保持不变,依然是 Hello World 。 Bash…

作者头像 李华
网站建设 2026/7/28 5:18:44

C#教程(小部分)

C#变量变量是存储数据值的容器。在 C# 中&#xff0c;有不同类型的变量&#xff08;用不同的关键字定义&#xff09;&#xff0c;例如:int - 存储整数&#xff08;整数&#xff09;&#xff0c;不带小数&#xff0c;如123或-123double - 存储带小数的浮点数&#xff0c;例如19.…

作者头像 李华