package com.interview.books.leetcodeoj;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-12-18
* Time: 下午2:57
*/
public class LOJ15_ThreeSum {
//sort array, and enumerate i, and find j and k using two pointer.
//1. i, j, k is the offset not element;
//2. inner while
//3. de dup using while
public List<List<Integer>> threeSum(int[] num) {
List<List<Integer>> triples = new ArrayList();
if(num.length < 3) return triples;
Arrays.sort(num);
for(int i = 0; i < num.length - 2; i++){
if(i != 0 && num[i] == num[i - 1]) continue; //de-dup
int j = i + 1;
int k = num.length - 1;
while(j < k){
int sum = num[i] + num[j] + num[k];
if(sum == 0){
List<Integer> triple = new ArrayList();
triple.add(num[i]);
triple.add(num[j]);
triple.add(num[k]);
triples.add(triple);
j++;
k--;
while(j < k && num[j] == num[j-1]) j++; //de-dup
while(j < k && num[k] == num[k+1]) k--; //de-dup
} else if(sum > 0){
k--;
} else {
j++;
}
}
}
return triples;
}
}