Description:
给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。
在三元组(a, b, c),要求a <= b <= c。
结果不能包含重复的三元组。
解法一:
思路:
这是一道综合题,考察函数设计,去重,双指针的知识,是非常值得一练的Two Sum变种题。
Code:
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>> results = new ArrayList<>();
if (numbers == null || numbers.length < 3){
return results;
}
Arrays.sort(numbers);
for (int i = 0; i < numbers.length - 2; i++){
//remove duplicates in the first num
if (i > 0 && numbers[i] == numbers[i - 1]){
continue;
}
int target = -numbers[i];
int left = i + 1;
int right = numbers.length - 1;
//twoSum函数是把符合要求的triple加到results
twoSum(numbers, left, right, target, results);
}
return results;
}
private void twoSum(int[] nums,
int left,
int right,
int target,
ArrayList<ArrayList<Integer>> results){
while (left < right){
if (nums[left] + nums[right] == target){
//triple临时变量,阅后即焚
ArrayList<Integer> triple = new ArrayList<>();
triple.add(-target);
triple.add(nums[left]);
triple.add(nums[right]);
results.add(triple);
left++;
right--;
while (left < right && nums[left] == nums[left - 1]){
left++;
}
while (left < right && nums[right] == nums[right + 1]){
right--;
}
} else if (nums[left] + nums[right] < target){
left++;
} else {
right--;
}
}
}
}