15. 3Sum

  • Total Accepted: 131800
  • Total Submissions: 675028
  • Difficulty: Medium

  Given an array S of n integers, are there elements abc 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的更多相关文章

  1. 【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 ...

  2. [Leetcode][015] 3Sum (Java)

    题目在这里: https://leetcode.com/problems/3sum/ [标签] Array; Two Pointers [个人分析] 老实交待,这个题卡半天,第一次做不会,抄别人的.过 ...

  3. LeetCode--No.015 3Sum

    15. 3Sum Total Accepted: 131800 Total Submissions: 675028 Difficulty: Medium Given an array S of n i ...

  4. 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 ...

  5. [Leetcode]015. 3Sum

    public class Solution { public List<List<Integer>> threeSum(int[] num) { Arrays.sort(num ...

  6. 【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 ...

  7. [Leetcode][016] 3Sum Closest (Java)

    题目: https://leetcode.com/problems/3sum-closest/ [标签]Array; Two Pointers [个人分析] 这道题和它的姊妹题 3Sum 非常类似, ...

  8. 《LeetBook》leetcode题解(15):3Sum[M]

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  9. [目录][Leetcode] Leetcode 题解索引

    之前想边做题边写结题报告,发现有点力不从心,而且很多地方也是一知半解,现在重新做题,重新理解.这篇文章主要起一个目录的作用. 目前没有什么特定的顺序,基本都是看心情翻牌的,哈哈~ 我在Github上新 ...

随机推荐

  1. ubuntu 配置JDK环境

    /etc/profile中加入以下代码 JAVA_HOME为JDK包解压的路径export JAVA_HOME=/home/exayong/jvm/jdk1.8.0_111 export JRE_HO ...

  2. poj3268 最短路

    //Accepted 1124 KB 0 ms #include <cstdio> #include <cstring> #include <iostream> # ...

  3. 动手实现自己的 STL 容器 《1》---- vector

    本文参考了侯捷的 <STL 源码分析>一书,出于兴趣,自行实现了简单的 vector 容器. 之后会陆续上传 list, deque 等容器的代码,若有错误,欢迎留言指出. vector ...

  4. H.264 / MPEG-4 Part 10 White Paper-翻译

    1. Introduction Broadcast(广播) television and home entertainment(娱乐) have been revolutionised(彻底改变) b ...

  5. C语言数组初始化

    例如: int a[15] = {0}; 第一种,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素.如果没有给出初始值,编译器不会去做初始化工作.这样简洁的方式让代码更加高效. 还 ...

  6. mudOS源码 options.h配置详细选项

    /* options.h配置详细选项—————————————————————————-将 MudOS 下载解压以后可以在相应目录的根目录中找到 options.h 这个文件.如果修 改了这个文件,那 ...

  7. 常用加实用的Linux命令

    命令是计算机执行任务的指令.可以使用命令去关闭计算机,或者列出当前目录的文件列表,或当前文本的内容,或者屏幕显示一条消息等. 下面是各种基本的命令可供参考. 1.Ls - List ls会列举出当前工 ...

  8. TCP发送接口的返回值

    原文链接: http://blog.csdn.net/ordeder/article/details/17240221 1. TCP发送接口:send() TCP发送数据的接口有send,write, ...

  9. iOS常用设计模式和机制之代理

    Delegate : 1 代理设计模式的使用我们首先需要明白三个要素 *委托方:委托别人去执行某些操作的人(对象) *代理方:被委托区执行某些操作的人(对象) *协议:(protocol)委托方需要代 ...

  10. C#利用SMTP服务器发送邮件

    使用.net(C#)发送邮件学习手册(带成功案例) 1.了解发送邮件的三种方式 2.实例介绍使用client.DeliveryMethod = System.Net.Mail.SmtpDelivery ...