class Solution {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
public List<List<Integer>> threeSum(int[] num) {
if (num == null || num.length < 3) return ret;
Arrays.sort(num);
int len = num.length;
for (int i = 0; i < len-2; i++) {
if (i > 0 && num[i] == num[i-1]) continue;
find(num, i+1, len-1, num[i]); //寻找两个数与num[i]的和为0
}
return ret;
}
public void find(int[] num, int begin, int end, int target) {
int l = begin, r = end;
while (l < r) {
if (num[l] + num[r] + target == 0) {
List<Integer> ans = new ArrayList<Integer>();
ans.add(target);
ans.add(num[l]);
ans.add(num[r]);
ret.add(ans); //放入结果集中
while (l < r && num[l] == num[l+1]) l++;
while (l < r && num[r] == num[r-1]) r--;
l++;
r--;
} else if (num[l] + num[r] + target < 0) {
l++;
} else {
r--;
}
}
}
}
static ArrayList<ArrayList<Integer>> result = new ArrayList<>();
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
if(num==null || num.length<3)
return result;
Arrays.sort(num);
int len = num.length;
for(int i=0;i<len-2;i++){
//if(num[i] == num[i+1]) continue;
findtwosum(num,i+1,len-1,num[i]);
}
return result;
}
public static void findtwosum(int num[],int start,int end,int target){
int s = start;
int e = end;
while(s<e){
if(num[s]+num[e] + target ==0){
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(target);
list.add(num[s]);
list.add(num[e]);
if(!result.contains(list)){
result.add(list);
System.out.println(list);
}
s++;
e--;
}else if(num[s] + num[e] +target <0)
s++;
else
e--;
}
}