ref http://www.cnblogs.com/springfor/p/3859670.html
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();if(num==null || num.length<3) return res;
Arrays.sort(num);
// HashSet 作法
HashSet<ArrayList<Integer>> hs = new HashSet<ArrayList<Integer>>();
for(int i=0;i<num.length-2;i++){
int low = i+1;
int high = num.length-1; // 为啥不能拿出去,因为while loop夹逼的时候high的指针都变化了,所以下一个i的时候必须把high放到原位置
while(low<high){
int sum = num[i]+num[low]+num[high];
if(sum==0){
ArrayList<Integer> tmp = new ArrayList<Integer>();
tmp.add(num[i]);
tmp.add(num[low]);
tmp.add(num[high]);
if(!hs.contains(tmp)){
res.add(tmp);
hs.add(tmp);
}
low++;
high--;
}else if(sum<0){
low++;
}else high--;
}
}
return res;
}
}
// // two pointers 作法
for(int i=0;i<num.length-2;i++){ // 注意这里i循环到哪里哟
if(i==0||num[i]!=num[i-1]){
int low = i+1;
while(low<high){
int sum = num[i]+num[low]+num[high];
if(sum==0){
ArrayList<Integer> tmp = new ArrayList<Integer>();
tmp.add(num[i]);
tmp.add(num[low]);
tmp.add(num[high]);
res.add(tmp);
low++;
high--;
while(low<high && num[low]==num[low-1]){ // 注意这里是low 和low-1 比较
low++;
}
while(low<high && num[high]==num[high+1]){ // 注意这里是high 和high+1 比较
high--;
}
}else if(sum<0){
low++;
}else{
high--;
}
}
}
}
return res;
}
}