lintcode:三数之和
题目
给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。
如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:
(-1, 0, 1)
(-1, -1, 2)
在三元组(a, b, c),要求a <= b <= c。
结果不能包含重复的三元组。
解题:
法一:直接暴力,时间复杂度是O(N3)
public class Solution {
/**
* @param numbers : Give an array numbers of n integer
* @return : Find all unique triplets in the array which gives the sum of zero.
*/
public ArrayList<ArrayList<Integer>> threeSum(int[] numbers) {
// write your code here ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(numbers == null || numbers.length<3)
return result;
for(int i = 0;i< numbers.length - 2 ; i++){
ArrayList<Integer> path = new ArrayList<Integer>();
for(int j = i+1;j < numbers.length - 1 ; j++){
for(int k = j+ 1 ; k < numbers.length ; k++)
if(numbers[i] + numbers[j] + numbers[k] == 0 ){
path = sort3(numbers[i],numbers[j],numbers[k]);
if(result.contains(path)==false)
result.add(path);
}
}
}
return result;
}
public ArrayList<Integer> sort3(int a,int b,int c){
ArrayList<Integer> path = new ArrayList<Integer>();
if(a>b){
int tmp = a;
a = b;
b = tmp;
}
if(c<=a){
path.add(c);
path.add(a);
path.add(b);
}else if(c>=b){
path.add(a);
path.add(b);
path.add(c);
}else{
path.add(a);
path.add(c);
path.add(b);
}
return path; } }
Java Code
在运行到94%的测试数据的时候WA,下面答案只是第三个和第二个的顺序不一样,怎么能就算错了?
法二:
将原数组存放中ArrayList中,通过判断 -(nums[i]+nums[j]) 是否在ArrayList中,少了第三个for循环,时间复杂度O(N2)增加了空间发杂度O(N)
public class Solution {
/**
* @param numbers : Give an array numbers of n integer
* @return : Find all unique triplets in the array which gives the sum of zero.
*/
public ArrayList<ArrayList<Integer>> threeSum(int[] numbers) {
// write your code here
ArrayList<Integer> path = new ArrayList<Integer>();
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(numbers == null || numbers.length<3)
return result;
ArrayList<Integer> nums = new ArrayList<Integer>();
for(int i = 0 ;i < numbers.length ; i++)
nums.add(numbers[i]);
for(int i = 0;i< nums.size() - 2;i++){
for(int j = i+ 1; j<nums.size() -1;j++){
int sum = -((Integer)nums.get(i) + (Integer)nums.get(j));
if(nums.contains(sum) && nums.indexOf(sum) !=j && nums.indexOf(sum) !=i){
path = sort3(sum,nums.get(i),nums.get(j));
if(result.contains(path)==false)
result.add(path);
}
}
}
return result;
}
public ArrayList<Integer> sort3(int a,int b,int c){
ArrayList<Integer> path = new ArrayList<Integer>();
if(a>b){
int tmp = a;
a = b;
b = tmp;
}
if(c<=a){
path.add(c);
path.add(a);
path.add(b);
}else if(c>=b){
path.add(a);
path.add(b);
path.add(c);
}else{
path.add(a);
path.add(c);
path.add(b);
}
return path; } }
Java Code
但是运行还是出现上面的情况
法三:
三个数的和基础还是两个数的和、两个数的和||,a+b+c = 0,等价于a+b = -c,这样就和两个数的和|| 很类似,当然也可以参考两个数的和I求解。
先对数组排序,排序后的数组,定义其实节点i,然后对i+1 到len内的所有节点进行两端遍历,这里利用二分查找的思想,
设两端的两个下标是left 和right ,显然 sum=nums[i] + nums[left] + nums[right] >0时候 ,right--,小于0的时候left++,等于0的时候就是答案。时间复杂度O(NlogN)
public class Solution {
/**
* @param numbers : Give an array numbers of n integer
* @return : Find all unique triplets in the array which gives the sum of zero.
*/
public ArrayList<ArrayList<Integer>> threeSum(int[] numbers) {
// write your code here ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(numbers == null || numbers.length<3)
return result;
Arrays.sort(numbers);
for(int i = 0;i<numbers.length; i++){
int left = i+ 1;
int right = numbers.length - 1;
while(left < right){
int sum = numbers[i] + numbers[left] + numbers[right];
ArrayList<Integer> path = new ArrayList<Integer>();
if(sum==0){
path.add(numbers[i]);
path.add(numbers[left]);
path.add(numbers[right]);
if(result.contains(path)==false)
result.add(path);
left++;
right--;
}else if(sum>0){
right--;
}else{
left++;
}
}
} return result;
} }
Java Code
总耗时: 1094 ms
class Solution:
"""
@param numbersbers : Give an array numbersbers of n integer
@return : Find all unique triplets in the array which gives the sum of zero.
"""
def threeSum(self, numbers):
# write your code here
result = []
if numbers == None or len(numbers) < 3:
return result
numbers.sort()
numlen = len(numbers)
for i in range(numlen):
left = i + 1
right = numlen - 1
while left < right:
sum = numbers[i] + numbers[left] + numbers[right]
if sum==0:
path = [numbers[i],numbers[left],numbers[right]]
if path not in result:
result.append(path)
left +=1
right -=1
elif sum>0:
right -=1
else:
left +=1 return result
Python Code
总耗时: 195 ms
lintcode:三数之和的更多相关文章
- lintcode: 三数之和II
题目 三数之和 II 给一个包含n个整数的数组S, 找到和与给定整数target最接近的三元组,返回这三个数的和. 样例 例如S = . 和最接近1的三元组是 -1 + 2 + 1 = 2. 注意 ...
- [LeetCode] 3Sum Smaller 三数之和较小值
Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 < ...
- [LeetCode] 3Sum Closest 最近三数之和
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- [LeetCode] 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 16. 3Sum Closest. (最接近的三数之和)
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- LeeCode数组第15题三数之和
题目:三数之和 内容: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中 ...
- LeetCode第十六题-找出数组中三数之和最接近目标值的答案
3Sum Closest 问题简介: 给定n个整数的数组nums和整数目标,在nums中找到三个整数,使得总和最接近目标,返回三个整数的总和,可以假设每个输入都只有一个解决方案 举例: 给定数组:nu ...
- 南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和
问题 A: 变位词 时间限制: 2 Sec 内存限制: 10 MB提交: 322 解决: 59提交 状态 算法问答 题目描述 请大家在做oj题之前,仔细阅读关于抄袭的说明http://www.bi ...
- python三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
随机推荐
- 8款实用的Jquery瀑布流插件
1.网友Null分享Jquery响应式瀑布流布局插件 首先非常感谢网友Null的无私分享,此作品是一款响应式瀑布流布局Jquery插件,网友Null增加了一个屏幕自适应和响应式,响应式就是支持智能手机 ...
- 基础学习总结(八)--Intent中显示意图和隐式意图的用法
Intent(意图)主要是解决Android应用的各项组件之间的通讯.Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组 ...
- nginx 日志管理
日志管理 我们观察nginx的server段,可以看到如下类似信息 #access_log logs/host.access.log main; 这说明 该server, 它的访问日志的文件是 ...
- [大牛翻译系列]Hadoop(12)MapReduce 性能调优:诊断硬件性能瓶颈
6.2.5 硬件性能问题 尽管单独的硬件的MTTF(平均失效前时间)都数以年记,然而在集群中就完全不是这么一回事了.整个集群的MTTF就要小得多.这一节要介绍如何确定CPU,内存,磁盘和网络是否过度利 ...
- sqlserver中distinct的用法(不重复的记录)
下面先来看看例子: table表 字段1 字段2 id name 1 a 2 b 3 c 4 ...
- CLR via C# 内存管理读书记
1. CLR 垃圾回收采用基于代的机制, 在一次垃圾回收中存活下来的对象被提升到另一代 2. 在确认对象是否垃圾时,从一组根开始,根包括静态字段,方法参数,局部变量等 3. 使用CriticalFin ...
- pyQuery的安装
1. 直接通过pip安装 你会发现lxml怎么搞都报错,后来单独先安装libxml2和libxslt pip是找不到这个包的,只好百度.发现有很多的例子的解决方案.后来发现了个实用的. 2. 先安装l ...
- uWSGI uwsgi_response_write_body_do(): Connection reset by peer 报错的解决方法
服务器架构是:Nginx+uWSGI+Django 某一天,发现服务器返回的response不完整,例如文档大小是200K的,但是只返回了100K给浏览器. 查了一下uWSGI的日志,发现以下错误: ...
- linux c 分解质因数
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> ...
- Oracle中的for语句
for语句是一个可预置循环次数的循环控制语句,他是一个循环计数器,通常是一个整形变量,通过这个循环计数器来控制循环执行的次数 语法如下: for variable_counter_name in [e ...