您的位置:首页 > 其它

题目:三数之和

2015-08-22 00:43 337 查看

给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。

您在真实的面试中是否遇到过这个题?

Yes

样例

如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:

(-1, 0, 1)

(-1, -1, 2)

注意

在三元组(a, b, c),要求a <= b <= c。

结果不能包含重复的三元组。

标签 Expand

相关题目 Expand

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
if(null==numbers||0==numbers.length)  return null;
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
//先排序,可以选择更加优秀的排序方式比如快排,合并等
for(int i=0;i<numbers.length;i++){
for(int j=i;j<numbers.length;j++){
if(numbers[i]>numbers[j]){
int tmp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = tmp;
}
}
}
//a+b+c = 0 ; b+c = -a,就相当于求2者的和,用2个指针分别指向排序好的数组,需要去判断唯一性
//a,b,c 若与相邻元素的一致则跳过
for(int i=0;i<numbers.length;i++){
if(i>=1){
if(numbers[i] == numbers[i-1]){
continue;
}
}
int s = i+1;
int e = numbers.length-1;
while(s<e){
if(s>i+1&&numbers[s]==numbers[s-1]){
s++;
continue;
}
if(e<numbers.length-1&&numbers[e]==numbers[e+1]){
e--;
continue;
}
if(numbers[s]+numbers[e]==(0-numbers[i])){
ArrayList<Integer> tmp = new ArrayList<>();
tmp.add(numbers[i]);
tmp.add(numbers[s]);
tmp.add(numbers[e]);
res.add(tmp);
s++;
}else if(numbers[s]+numbers[e]>(0-numbers[i])){
e--;
}else{
s++;
}
}
}
return res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: