news 2026/7/5 1:40:54

Leetcode hot100 三数之和【中等】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Leetcode hot100 三数之和【中等】

首先用直觉,直觉可以变成两数之和的问题,因为nums[i]+nums[j]+nums[k]==0,其实也就是-nums[i]=nums[j]+nums[k],想到两数之和是不够的,关键在于想到要把nums排序。排序可以同时解决两件事,一是避免重复的三元组,二是求两数之和的时候既然是从小到大排列的那么就不用双重循环了可以双指针。

class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> res = new ArrayList<>(); Arrays.sort(nums); for(int i=0;i<nums.length-1;i++){ //避免重复的三元组措施1 //这一轮不要了,比如nums={-8,-8,-8,2,2,3,5,5,6},那么遍历完nums[0]=-8以后,nums[1]和nums[2]都跳过,直接去nums[3]=2 if(i>0 && nums[i]==nums[i-1]) continue; twoSum(nums,-nums[i],i+1,res); } return res; } /** []nums: 题目传来的原数组 sum:两数目标和 start:最左起点 res: */ public void twoSum(int []nums, int sum, int start,List<List<Integer>> res){ int small = start; int big = nums.length-1; //跟快排一样,small==big的时候退出循环 while(small<big){ if(nums[small]+nums[big]<sum){ small++; while(small<big && nums[small]==nums[small-1]){ small++; } //small跳过所有重复值,此时指向新值。避免重复的三元组措施2 }else if(nums[small]+nums[big]>sum){ big--; while(small<big && nums[big]==nums[big+1]){ big--; } //big跳过所有重复值,此时big指向新值 }else if(nums[small]+nums[big]==sum){。避免重复的三元组措施2 List<Integer> temp = new ArrayList<>(); temp.add(nums[small]); temp.add(nums[big]); temp.add(nums[start-1]); res.add(temp); //这里让small去走也行,让big去走也行,我用的small small++; while(small<big && nums[small]==nums[small-1]){ small++; } //small跳过所有重复值,此时指向新值。避免重复的三元组措施2 } } } }

时间复杂度:排序算法时间复杂度O(nlogn),遍历过程中,外层循环把nums从左到右遍历一遍,内存循环双指针也是线性遍历,所以时间复杂度O(n^2)。整个算法的时间复杂度取O(nlogn)和O(n^2) 的最大值,所以是O(n^2)。

二、暴力解法

这个题小白很容易想到暴力解法,我们来看看暴力解法。

三重循环,麻烦在于对于三元组不重复的判断。一开始是下面的写法,很垃,直接不要看。

class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> res = new ArrayList<>(); //把所有可能的两数之和都存进去 for(int i=0;i<nums.length-2;i++){ for(int j=i+1; j<nums.length-1;j++){ for(int k=j+1;k<nums.length;k++){ if(nums[i]+nums[j]+nums[k]==0){ //判断和已有的结果不重复才加入 if(!ifExsits(res,nums,i,j,k)){ List<Integer> temp=new ArrayList<>(); temp.add(nums[i]); temp.add(nums[j]); temp.add(nums[k]); res.add(temp); } } } } } return res; } /** 避免重复三元组 */ public true ifExsits(List<List<Integer>> res, int[] nums,int i,in j,int k){ //笛卡尔积的方式去判断 } }

三元组不重复的正确判断方式应该是,先给nums排序,通过每一次进入循环判断跟上一次的数是否一样,一样的话跳出循环,这种方式来去重。

class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> res = new ArrayList<>(); //排序,升序降序都可以-->为了三元组去重 Arrays.sort(nums); //把所有可能的两数之和都存进去 for(int i=0;i<nums.length-2;i++){ if(i>0 && nums[i]==nums[i-1]) continue; //三元组去重 for(int j=i+1; j<nums.length-1;j++){ if(j>i+1 && nums[j]==nums[j-1]) continue; //三元组去重 for(int k=j+1;k<nums.length;k++){ if(k>j+1 && nums[k]==nums[k-1]) continue; //三元组去重 if(nums[i]+nums[j]+nums[k]==0){ List<Integer> temp=new ArrayList<>(); temp.add(nums[i]); temp.add(nums[j]); temp.add(nums[k]); res.add(temp); } } } } return res; } }

这种暴力解法会败在时间复杂度上:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 1:39:47

Web|Java Token 伪造绕过

一、前言本题是贴近 Java Web 后端开发的 CTF 入门题型&#xff0c;和 Servlet 课程设计的购物商城鉴权逻辑完全一致。题目采用前后端分离架构&#xff0c;放弃了传统的 Filter 过滤器&#xff0c;在每个接口中独立通过请求头 Token 完成登录鉴权。本题考察开发者对自定义 Toke…

作者头像 李华
网站建设 2026/7/5 1:39:39

MyBatisGX 0.2.0 发布:正式引入 MGXQL 对象查询语言

MyBatisGX 0.2.0 发布&#xff1a;正式引入 MGXQL 对象查询语言 大家好&#xff0c;经过一段时间的设计与重构&#xff0c;MyBatisGX 0.2.0 正式发布。 这是 MyBatisGX 自发布以来最重要的一次版本更新&#xff0c;也是查询体系正式成熟的一个里程碑。 本次版本最大的变化&…

作者头像 李华
网站建设 2026/7/5 1:38:41

sklearn KMeans 聚类评估实战:Seeds 数据集 3 指标对比与可视化

基于Seeds数据集的KMeans聚类三维评估体系构建与决策优化 在数据分析领域&#xff0c;聚类算法的效果评估一直是实践中的核心挑战。当面对Seeds这类经典数据集时&#xff0c;如何系统评估KMeans的聚类质量&#xff0c;并基于多维度指标做出最佳参数决策&#xff0c;成为数据科学…

作者头像 李华
网站建设 2026/7/5 1:38:31

MIPI、CSI、DSI、D-PHY到底是什么?它们之间的链路关系?

概述 在嵌入式系统&#xff08;手机、车载、IoT、工业相机&#xff09;中&#xff0c;CSI、DSI 和 D-PHY 是 MIPI 联盟定义的三项核心标准。简单说&#xff1a;CSI 管摄像头&#xff0c;DSI 管显示屏&#xff0c;D-PHY 是它们底层的物理传输通道。 三者分属协议栈的不同层次。一…

作者头像 李华
网站建设 2026/7/5 1:33:54

web安全代码基础-PHP(防护过滤操作)

目录 php.ini 全局安全配置&#xff08;服务器层面&#xff0c;第一道防线&#xff09; safe_mode 安全模式&#xff08;废弃&#xff0c;仅历史了解&#xff09; open_basedir 目录访问限制&#xff08;防目录遍历 / 跨目录文件读取&#xff09; disable_functions 禁用危险…

作者头像 李华
网站建设 2026/7/5 1:33:47

1921_关于AI大模型本地部署以及API token购买的一些想法

之前在网络上看到了很多本地部署大模型的说法&#xff0c;我一直没有尝试&#xff0c;总觉得这个东西可能会比较难&#xff0c;不一定能够快速的掌握起来。这个周末还是有点忍不住好奇之心&#xff0c;找了几个简单的教程看了看&#xff0c;发现这个东西部署起来原来是这么的容…

作者头像 李华