No.015 3Sum
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上新 ...
随机推荐
- This tag and its children can be replaced by one <TextView/> and a compound drawable
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- 银光类似web visio的节点连线控件Essential Diagram免费下载地址
Essential Diagram for Silverlight是一款功能强大的图解拓扑图控件,在XAML支持的情况下提供用户交互式地创建和编辑图解,支持数据绑定和多种布局,可以导出为多种文件格式等 ...
- 1、c#对XML文件的解析
1.XML文件 <?xml version="1.0" encoding="utf-8"?> <PersonF xmlns="&qu ...
- 传智博客.NET培训第13季 Ajax教程(共十三季) 学习资源
http://wangpengnimei.ctfile.com/u/1235801/47146 传智博客.NET培训第13季 Ajax教程(十三季).rar 19
- ubuntu14 + nginx + php
ubuntu14 1.安装nginx sudo apt-get install nginx 安装之后的文件结构大致为: * 所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/et ...
- kinnect相关
1. kinnect的现状. http://tech.qq.com/a/20150909/046760.htm 2. kinnect的相关工作 http://baike.baidu.com/link? ...
- MongoDB学习笔记一:入门
文档:多个键及其关联的值『有序』地放置在一起. {"greeting" : "Hello, world!", "foo" : 3}集合:一组 ...
- 转:RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- php微信接口实例
<?php /** * wechat php test */ //define your token //定义TOKEN秘钥 define("TOKEN", "we ...
- [Spring MVC] - 地址路由使用(一)
常用的一些Spring MVC的路由写法以及参数传递方式. 参考引用: http://docs.spring.io/spring/docs/3.0.x/spring-framework-referen ...