import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
Arrays.sort(num);
int prev = Integer.MIN_VALUE;
for (int i = 0; i < num.length; ) {
int start = i;
while (num[start] == prev) {
start++;
if (start >= num.length) {
return res;
}
}
prev = num[start];
List<Integer> sec = twoSum(num, -num[start], start+1, num.length - 1);
if (sec != null) {
for (int j = 0; j < (sec.size()/2); j++) {
ArrayList<Integer> temp = new ArrayList<>();
temp.add(num[start]);
temp.add(sec.get(2*j+0));
temp.add(sec.get(2*j+1));
res.add(temp);
}
}
i = start++;
}
return res;
}
List<Integer> twoSum(int[] num, int target, int low, int high) {
int sum;
List<Integer> ret=new ArrayList<>();
while (low < high) {
int left=num[low];
int right=num[high];
sum = num[low] + num[high];
if (sum > target) {
while(num[high]==right && low < high){
high--;
}
} else if (sum < target) {
while(num[low]==left && low < high){
low++;
}
} else {
ret.add(num[low]);
ret.add(num[high]);
while(num[high]==right && low < high){
high--;
}
while(num[low]==left && low < high){
low++;
}
}
}
//cant find
return ret;
}
}