【LeetCode】15、三数之和为0
题目等级:3Sum(Medium)
题目描述:
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
题意:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。
解题思路:
看到这个题目,我们首先会联想到LeetCode的第一个题:两数之和:【LeetCode】1、Two Sum。
两数之和比较简单,解法是利用了HashMap的查找优势,空间换时间将时间复杂度降到了O(n),这里是三数之和,当然可以类比,我们很容易想到可以先固定一个元素a,由于a+b+c=0,那么b+c=-a,所以就可以将三数之和转化为两数之和的问题。
而两数之和的问题我们已经解决,这样就得到本题的解答,然而,在实现这种思路的过程中,发现一个稍微有些棘手的问题是如何去重复,另外这样做的时间复杂度当然为O(n^2),额外空间复杂度是O(n)。
然后又在网上参考了一些其他人的解法,发现HashMap似乎并不是最好的解法,所以找到了另外一种解法。
思路如下:同样是先固定一个元素a,找b+c=-a,而最优美的地方就在于如何找着另外两个数b和c,这里不用HashMap,而是先将整个数组进行排序(排序时间复杂度O(nlogn)),然后可以利用前后双指针解法去找这两个元素。
这样做的好处有两个:一是不需要额外的空间,二是由于已经有序,去重简单。
代码实现的过程中,重点还是要关注一下如何去掉重复的情况,具体看代码。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res=new ArrayList<>();
if(nums==null||nums.length==0)
return res;
int len=nums.length;
Arrays.sort(nums); //第一步:先排序
for(int i=0;i<len-2;i++){ //依次遍历每一个元素,把它作为a,在后续的元素里找b+c=-a;
if(i>0 && nums[i]==nums[i-1])
continue; //重复元素直接跳过
//找两数之和为-a,双指针法
int low=i+1,high=len-1;
while(low<high){
if(nums[low]+nums[high]==-nums[i]){ //找到了一个解
res.add(Arrays.asList(nums[i],nums[low],nums[high]));
//已经找到了,重复的去掉
while(low<high && nums[low+1]==nums[low])
low++;
while(low<high && nums[high-1]==nums[high])
high--;
low++;
high--;
}else if(nums[low]+nums[high]<-nums[i])
low++;
else
high--;
}
}
return res;
}
}
时间复杂度:O(n^2),没有使用额外空间
总结
总结来说,本题的一个巧妙之处就是前后向两个指针同时遍历,实际上回顾一下,可以发现这种思想之前已经用过了:在《剑指Offer》第42题找和为S的两个数字使用的正是这样的解法:【剑指Offer】42、和为S的两个数字,但是这种思想只有在有序的情况下才能使用。
【LeetCode】15、三数之和为0的更多相关文章
- LeetCode 15. 三数之和(3Sum)
15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...
- Java实现 LeetCode 15 三数之和
15. 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以 ...
- LeetCode——15. 三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- LeetCode 15. 三数之和(3Sum)
题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复 ...
- [Leetcode 15]三数之和 3 Sum
[题目] Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? ...
- [LeetCode]15. 三数之和(数组)(双指针)
题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三 ...
- [LeetCode] 15. 三数之和
题目链接:https://leetcode-cn.com/problems/3sum/ 题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a ...
- LeetCode:三数之和【15】
LeetCode:三数之和[15] 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的 ...
- 代码随想录第七天| 454.四数相加II、383. 赎金信 、15. 三数之和 、18. 四数之和
第一题454.四数相加II 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, ...
随机推荐
- jquery reset选择器 语法
jquery reset选择器 语法 作用::reset 选择器选取类型为 reset 的 <button> 和 <input> 元素.直线电机滑台 语法:$(":r ...
- 上传base64图片至七牛云,并返回图片link
https://developer.qiniu.com/kodo/kb/1326/how-to-upload-photos-to-seven-niuyun-base64-code
- 【CUDA 基础】4.1 内存模型概述
title: [CUDA 基础]4.1 内存模型概述 categories: - CUDA - Freshman tags: - CUDA内存模型 - CUDA内存层次结构 - 寄存器 - 共享内存 ...
- Python GDAL
https://gdal.org/ https://pypi.org/project/GDAL/ gdal whl:https://blog.csdn.net/u012581929/article/d ...
- 如何设计出优美的Web API?
概述 WEB API的应用场景非常丰富,例如:将已有系统的功能或数据开放给合作伙伴或生态圈:对外发布可嵌入到其他网页的微件:构建前后端分离的WEB应用:开发跨不同终端的移动应用:集成公司内部不同系统等 ...
- [ML] Gradient Boost
参考链接: 1. https://medium.com/@cwchang/gradient-boosting-%E7%B0%A1%E4%BB%8B-f3a578ae7205 2. https://zh ...
- [CSP-S模拟测试]:慢无止境的八月(乱搞)
题目传送门(内部题102) 输入格式 第一行三个正整数$n,k,q$,分别表示数列长度,操作长度和修改个数. 第二行$n$个数,表示给出的终止数列. 接下来$q$行,每行两个数$pos,dx$,表示将 ...
- SCOI2009迷路
当初学矩阵幂的时候弃掉了,那时候只会用矩阵优化递推,碰到这种图论的瞬间躺地. 昨天听学长的课,有一道例题,在边权为一的图上求从某点到某点的路径方案数,只要对邻接矩阵跑qpow就完事了. 于是自己画了个 ...
- mongo数据库的使用
mongodb 是一个非关系型数据库,跟每一个数据库都没有关系,(mysql 是一个关系型数据库)他以集合(collections)问单位,他长得和 json 一样 mongo 数据库的下载,安装 自 ...
- Scope 'request' is not active for the current thread
Unable to instantiate Action, getUserAction, defined for 'getUser' in namespace '/'Error creating be ...