15. 3Sum
- Total Accepted: 131800
- Total Submissions: 675028
- Difficulty: Medium
Given an array S of n integers, are there elements a, b, c in S 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.
For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
] 思路:
首先说点题外话,对于2Sum,3Sum,以及后面的4Sum,kSum等是一个系列的,具体的讨论在这篇文章中有提到,大家感兴趣的可以看看:http://www.sigmainfy.com/blog/summary-of-ksum-problems.html
回到正文,这道题很容易想到的是暴力解法,这也是我们通常采用的办法,但是这样的方法的复杂度是O(n3),再加上去重的复杂度,这样的代码在leetcode是无法成功运行的。 对于简化的思路,我自己没有想出来,网上参考的是:【LeetCode】3Sum 解题报告
我们不妨先对数组排个序。排序之后,我们就可以对数组用两个指针分别从前后两端向中间扫描了,如果是 2Sum,我们找到两个指针之和为target就OK了,那 3Sum 类似,我们可以先固定一个数,然后找另外两个数之和为第一个数的相反数就可以了。代码不难,先看了再说。
public class No_015 {
/*
* 方法一:暴力解法
*/
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>() ;
if(nums == null || nums.length < 3){
return res ;
}
List<Integer> list = null ;
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){
list = toRange(nums,i,j,k) ;
if(!isContain(res,list)){
res.add(list) ;
}
}
}
}
}
return res ;
} /*
* 对三个数之和为0的数加入list的时候进行排序,方便后面去重
*
* 唉,怎么没想到一开始就对曾格格数组进行排序呢???
*/
private List<Integer> toRange(int [] nums ,int i , int j , int k){
List<Integer> list = new ArrayList<Integer>() ;
int max = nums[i]>nums[j]?nums[i]:nums[j] ;
int min = nums[i]+nums[j]-max ;
max = max>nums[k]?max:nums[k] ;
min = min<nums[k]?min:nums[k] ;
list.add(min) ;
list.add(nums[i]+nums[j]+nums[k]-max-min) ;
list.add(max) ;
return list ;
}
/*
* 检查是否有重复
*/
private boolean isContain(List<List<Integer>> res , List<Integer> list){
if(res == null || res.size() == 0){
return false ;
}
for(List<Integer> each:res){
if(each.get(0) == list.get(0) && each.get(1) == list.get(1)){
return true ;
}
}
return false ;
} /*
* 方法二:首先进行排序,然后根据排序之后的数组,从两边到中间的办法查询,这样复杂度为o(n^2)
*/
List<List<Integer>> ret = new ArrayList<List<Integer>>();
public List<List<Integer>> threeSum2(int[] num) { if (num == null || num.length < 3)
return ret; Arrays.sort(num); int len = num.length;
for (int i = 0; i < len - 2; i++) {
if (i > 0 && num[i] == num[i - 1])
continue;
find(num, i + 1, len - 1, num[i]); // 寻找两个数与num[i]的和为0
} return ret;
} public void find(int[] num, int begin, int end, int target) {
int l = begin, r = end;
while (l < r) {
if (num[l] + num[r] + target == 0) {
List<Integer> ans = new ArrayList<Integer>();
ans.add(target);
ans.add(num[l]);
ans.add(num[r]);
ret.add(ans); // 放入结果集中
while (l < r && num[l] == num[l + 1])
l++;
while (l < r && num[r] == num[r - 1])
r--;
l++;
r--;
} else if (num[l] + num[r] + target < 0) {
l++;
} else {
r--;
}
}
} }
No.015 3Sum的更多相关文章
-
【JAVA、C++】LeetCode 015 3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
-
[Leetcode][015] 3Sum (Java)
题目在这里: https://leetcode.com/problems/3sum/ [标签] Array; Two Pointers [个人分析] 老实交待,这个题卡半天,第一次做不会,抄别人的.过 ...
-
LeetCode--No.015 3Sum
15. 3Sum Total Accepted: 131800 Total Submissions: 675028 Difficulty: Medium Given an array S of n i ...
-
015 3Sum 三个数的和为目标数字
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
-
[Leetcode]015. 3Sum
public class Solution { public List<List<Integer>> threeSum(int[] num) { Arrays.sort(num ...
-
【LeetCode】015 3Sum
题目: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find al ...
-
[Leetcode][016] 3Sum Closest (Java)
题目: https://leetcode.com/problems/3sum-closest/ [标签]Array; Two Pointers [个人分析] 这道题和它的姊妹题 3Sum 非常类似, ...
-
《LeetBook》leetcode题解(15):3Sum[M]
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
-
[目录][Leetcode] Leetcode 题解索引
之前想边做题边写结题报告,发现有点力不从心,而且很多地方也是一知半解,现在重新做题,重新理解.这篇文章主要起一个目录的作用. 目前没有什么特定的顺序,基本都是看心情翻牌的,哈哈~ 我在Github上新 ...
随机推荐
-
golang笔记——array
1.定义一个 array 数组长度也是类型的一部分,比如长度为3的int数组与长度为5的int数组,并不是同一类型. package main import ( "strconv" ...
- CSS3-html,样式与样式表的创建,选择器
-
bash检查文件格式
情形描述:最近在做一个ETL的项目,用的是CLoverETL,需要在拿到文件后对文件格式进行检验,以决定是否继续. 主要功能是检查每个文件中有几个“|”符号,项目中约定以该符号来作为分隔,所以检查每个 ...
-
分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试
参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...
-
WWF3动态修改工作流<;第九篇>;
一.动态添加或移除工作流活动 首先添加一个顺序的空白工作流. 然后添加一个Winform程序,界面如下: 代码如下: namespace WinForm { public partial class ...
-
火狐和google游览器的 hack独有识别 css
先来看google的: /* 这针对于webkit内核的游览器.包括苹果谷歌游览器等*/ @media screen and (-webkit-min-device-pixel-ratio:0) { ...
-
freemarker入门教程
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输 ...
-
D - Mayor&#39;s posters - 2528(区间覆盖)
题意:贴海报 有一面很长的墙,大概有10000000 这么长,现有有一些海报会贴在墙上,当然贴海报的顺序是有先后的,问你当最后一张海报也贴上的时候能不能求出来在这面墙上能看到多少张不同的海报? 分析: ...
-
“幸福企业”定义-参观“MES项目”有感
作为公司的员工,总是想在一个自己满意的企业里面发展.作为企业主,虽不能天天将“回报社会”挂在嘴上,但凡是有抱负的,还是希望自己的部下“以厂为家的”.然而劳资双方的矛盾总是让双方感觉互有亏欠.这种不信任 ...
-
CodeForces - 556B Case of Fake Numbers
//////////////////////////////////////////////////////////////////////////////////////////////////// ...