news 2026/4/30 23:16:55

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/4/25 14:25:34

创业孵化器推荐:使用LobeChat降低初期成本

创业孵化器推荐&#xff1a;使用LobeChat降低初期成本 在今天的创业环境中&#xff0c;一个好点子能否快速验证、低成本落地&#xff0c;往往决定了项目生死。尤其是在AI浪潮席卷各行各业的当下&#xff0c;几乎每个初创团队都在思考&#xff1a;“我们能不能做个智能助手&…

作者头像 李华
网站建设 2026/4/21 19:32:17

10、函数构建块与流编辑器入门

函数构建块与流编辑器入门 函数构建块 在脚本编程中,函数是非常重要的组成部分,它能让脚本更易于维护,提升其最终功能。以下将介绍函数使用中的几个关键方面。 传递数组 并非所有传递给函数的值都是单个值,有时需要传递数组。以下是传递数组作为参数的示例代码: #!/…

作者头像 李华
网站建设 2026/4/30 5:39:14

11、流编辑器(sed)与Apache虚拟主机自动化配置

流编辑器(sed)与Apache虚拟主机自动化配置 1. 命令行文件格式化与目录条目隔离 在命令行中,我们拥有强大的文件格式化能力。例如,使用以下命令可以执行当前目录下的 UPPMT 目录文件脚本: $ parsecsv.sh tools如果需要搜索特定的目录条目,比如搜索 hammer ,由于条…

作者头像 李华
网站建设 2026/4/23 16:09:19

LobeChat品牌故事创作灵感激发

LobeChat&#xff1a;当开源遇见对话智能 在大模型掀起技术浪潮的今天&#xff0c;我们几乎每天都能看到新的AI产品横空出世。然而一个有趣的现象是&#xff1a;尽管底层模型能力越来越强——从GPT-4到Claude 3&#xff0c;再到通义千问、ChatGLM等国产明星模型——但普通用户真…

作者头像 李华
网站建设 2026/4/28 2:24:17

15、使用AWK总结日志

使用AWK总结日志 1. HTTPD日志文件格式 在处理任何文件时,首先要熟悉文件的结构。我们将处理Apache HTTPD Web服务器的访问日志文件。日志文件的位置可通过 httpd.conf 文件控制。在基于Debian的系统中,默认日志文件位置是 /var/log/apache2/access.log ,其他系统可能…

作者头像 李华