题目描述:
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:
Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c) 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)
解题思路:
- 这题和上一题 two-sum 很像,但是肯定不能再用两层 for 循环来操作了
- 首先将原始数据排序,然后依次选定一个数 i,同时设置两个指针,一个指向 i + 1, 一个指向数组的尾部,不断的迭代,,直到找出符合题意的解
- 这里同时要注意重复的问题,否则的话,时间复杂度会很高
代码如下:
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
Arrays.sort(num);
// 依次选择元素来处理
for(int i = 0;i < num.length;i++){
//相邻元素相同,可以跳过
if(i == 0 || num[i] > num[i-1]){
int j = i+1;
int k = num.length-1;
while(j < k){
if(num[i] + num[j] + num[k] == 0){
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(num[i]);
list.add(num[j]);
list.add(num[k]);
result.add(list);
j++;
k--;
// 相同的元素跳过
while(j < k && num[j] == num[j-1]){
j++;
}
while(j < k && num[k] == num[k+1]){
k--;
}
}else if(num[i] + num[j] + num[k] < 0){
j++;
}else{
k--;
}
}
}
}
return result;
}