Notes: 求三个数的和为0的子数组;
1、对数组排序;
2、对于每个a = num[i],问题是在num[i+1]到num[n-1]中 b+c = -a:
记b = num[i + 1],c = num[n-1];
sum = a + b + c;
若sum < 0,则j++;
若sum > 0,则k--;
若sum == 0,则表示找到,记录下来,j++,接着找;
判断triplet是否重复的情况,首先如果a = (num[i] == num[i- 1]),说明子问题已经解决过,则跳过;
然后如果同一个a的时候,b相同,说明该triplet已经存在于list中,不需要再记录,跳过;
public class Solution {
public List<List<Integer>> threeSum(int[] num) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
int a, b, c, sum;
int i, j, k;
Arrays.sort(num);
boolean flag = false;
for (i = 0; i < num.length; i++) {
flag = false;
if(i == 0 || num[i] != num[i-1]){
a = num[i];
j = i + 1;
k = num.length - 1;
while(j < k){
b = num[j];
c = num[k];
sum = a + b + c;
if(sum < 0){
j++;
}
else if(sum == 0){
if(!flag){
List<Integer> triplet = new ArrayList<Integer>();
triplet.add(num[i]);
triplet.add(num[j]);
triplet.add(num[k]);
list.add(triplet);
flag = true;
}
else {
if (num[j] != num[j - 1]) {
List<Integer> triplet = new ArrayList<Integer>();
triplet.add(num[i]);
triplet.add(num[j]);
triplet.add(num[k]);
list.add(triplet);
}
}
j++;
}
else {
k--;
}
}
}
}
return list;
}
}