给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。
注意事项
在三元组(a, b, c),要求a <= b <= c。
结果不能包含重复的三元组。
样例
如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:
(-1, 0, 1)
(-1, -1, 2)
一刷没有ac
二刷没ac
解题思路:先对数组排序,然后遍历数组,每次选定一个元素之后,前后指针夹一下,判断夹在一起的和是否等于元素。
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) {
ArrayList<ArrayList<Integer>> rst = new ArrayList<ArrayList<Integer>>();
if(numbers == null || numbers.length == 0) return rst;
Arrays.sort(numbers);
for(int i = 0; i < numbers.length; i++){
if(i == 0 || numbers[i] != numbers[i-1]){
int left = i + 1;
int right = numbers.length - 1;
while(left < right){
int sum = numbers[i] + numbers[left] + numbers[right];
if(sum == 0){
ArrayList<Integer> tmp = new ArrayList<Integer>();
tmp.add(numbers[i]);
tmp.add(numbers[left]);
tmp.add(numbers[right]);
rst.add(tmp);
left++;
right--;
while(left < right && numbers[left] == numbers[left-1]){
left++;
}
while(left < right && numbers[right] == numbers[right+1]){
right--;
}
}else if(sum < 0){
left++;
}else if(sum > 0){
right--;
}
}
}
}
return rst;
}
}