【算法】3Sum 三数之和

news/2025/2/12 19:55:21/

文章目录

  • 3Sum 三数之和
    • 问题描述:
    • 分析
    • 代码
    • Tag

3Sum 三数之和

问题描述:

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组

3 < = n u m s . l e n g t h < = 3000 − 1 0 5 < = n u m s [ i ] < = 1 0 5 3 <= nums.length <= 3000\\\ -10^5 <= nums[i] <= 10^5 3<=nums.length<=3000 105<=nums[i]<=105

分析

需要找出所有和为0 ,但是又不能重复的三元组。
也就是说一个有效的三元组,x+y+z=0,并且下标不一样。
而且还需要不能重复。

最朴素的方式就是暴力,可以枚举出所有符合条件的组合,然后去重,或者是在过程中去重。

而最容易联想到的就是2sum,固定x,枚举yz,时间复杂度 O ( N 3 ) O(N^3) O(N3),去重的时间和空间开销还没算进去。

该策略太暴力,容易实现,但是时间复杂度太高无法快速得到结果。

基于2sum中的双指针,可以在 O ( N ) O(N) O(N)的时间复杂度下找到2个元素.

所以可以尝试固定x,然后使用双指针的方式找到yz,时间复杂度 O ( N 2 ) O(N^2) O(N2)
这个思路明显由于上面的暴力,但是还有一个问题没有解决,就是重复

在使用双指针策略之前,首先要做的就是sort。

之所以重复,就是在无序的状态下,可能会找到一组xyz,然后又找到了yxz,这就产生了重复。

因此在这个过程中,依然是固定x,但是x只能使用一次,同时要确保组合中的x<=y<=z

这样一个x,可能会找到多组的yz,但是组合不会重复。

代码

 public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new        ArrayList<List<Integer>>();if(nums == null || nums.length<3){return result;}Arrays.sort(nums);for(int i=0; i<nums.length-2; i++){if(i==0 || nums[i] > nums[i-1]){int j=i+1;int k=nums.length-1;while(j<k){if(nums[i]+nums[j]+nums[k]==0){List<Integer> l = new ArrayList<Integer>();l.add(nums[i]);l.add(nums[j]);l.add(nums[k]);result.add(l);    j++;k--; while(j<k && nums[j]==nums[j-1]){j++;}while(j<k && nums[k]==nums[k+1]){k--;}}else if(nums[i]+nums[j]+nums[k]<0){j++;}else{k--;}}}    }return result;}

时间复杂度 O ( N 2 ) O(N^2) O(N2)

空间复杂度 O ( log ⁡ N ) O(\log N) O(logN)

Tag

Array

Two Pointers

Sort


http://www.ppmy.cn/news/807632.html

相关文章

前端---定位

前端定位包括&#xff1a;定位模式和边偏移量两个部分 边偏移量 边偏移量是告诉盒子往那边走。 边偏移量属性描述top顶部偏移量&#xff0c;相对于父元素bottom底部偏移量&#xff0c;相对于父元素left左侧偏移量&#xff0c;相对于父元素right右侧偏移量&#xff0c;相对于…

win10如何去掉电脑桌面快捷方式图标小箭头?(强迫症必看)--附还原方法

将以下代码复制到EverEdit文本编辑软件中–另存为名称.bat类型的文件&#xff0c;双击运行文件结束后&#xff0c;则图标快捷方式箭头去掉了 一、去除 reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d &quo…

safari快捷图标不见了_原神启动器维护之后不见了怎么找 启动器找寻技巧分享[多图]...

原神启动器维护之后不见了&#xff0c;这个怎么回事&#xff0c;很多玩家都在游戏中找启动器&#xff0c;很尴尬的&#xff0c;pc版的启动器不见了&#xff0c;萌新表示不知道在哪里找到&#xff0c;下面就来介绍下具体的找寻方法。 原神启动器找寻方法分享 一、桌面回收站 当…

如何隐藏电脑下方工具栏个别图标_怎么隐藏电脑任务栏右边的各种小图标 - 卡饭网...

怎么在电脑任务栏中关闭QQ的图标 怎么在电脑任务栏中关闭QQ的图标 有不少小伙伴都喜欢在电脑上登录QQ,有时候并不想要被打扰,因此想要关闭任务栏中QQ的图标,但是却不知道如何关闭,那么小编就来为大家介绍一下吧.具体如下:1. 第一步,双击或者右击打开QQ软件.2. 第二步,来到下图所…

桌面html快捷方式总消失,桌面软件的快捷方式不见了怎么恢复 快捷方式不见了恢复方法汇总...

回收站里恢复&#xff1a; 相信每一个小伙伴都会有迷糊、粗心的时候。有时候就会糊里糊涂地把一些重要的东西突然丢到回收站里面去了。也许有些时候是想删掉别的东西&#xff0c;不小心就给选错了&#xff1b;也许某个时候&#xff0c;突然觉得没有用了&#xff0c;就直接把它丢…

拯救强迫症!怎样去除电脑桌面快捷方式图标上的小箭头、小盾牌?

你使用电脑的过程中&#xff0c;看到桌面快捷方式图标的小箭头是不是很抓狂呢&#xff1f;对于有强迫症的人&#xff0c;真是痛苦&#xff01;&#xff08;别问我怎么知道的&#xff1f;我不会承认我有病的&#xff01;&#xff09;别怕&#xff0c;今天&#xff0c;我们就分享…

桌面没有计算机图标6,我的电脑图标没了怎么办

桌面的快捷方式图标通过不同的图标我们可以快速的打开相呼应的应用程序&#xff0c;除此之外系统还有一些自带的桌面图标&#xff0c;这些桌面的基本图标可以说对我们是非常重要的&#xff0c;基本的电脑操作设置都可以通过这些桌面图标来处理&#xff0c;特别是其中“我的电脑…

电脑小手图标怎么去除_图文教你去除桌面图标箭头_消除电脑图标小箭头的方法-系统城...

电脑上的图标一般都是默认设置好的&#xff0c;细心的小伙伴发现自己电脑桌面有个快捷方式小箭头&#xff0c;感觉作用也不是很大&#xff0c;一直显示小箭头感觉比较难看&#xff0c;于是想去掉小箭头&#xff0c;有什么办法实现&#xff1f;其实操作步骤很简单&#xff0c;大…