import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        //1. 初始化
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        if(num == null || num.length < 3){
            return res;  
        }

        //2. 排序
        Arrays.sort(num);

        //3. i用于确定第一个数
        for(int i =0; i < num.length; i++){
            //3.1 因为已经排过序,若第一个数就大于0,三数之和肯定大于0。
            if(num[i] >  0){
                break;
            }

            //3.2 对第一个数进行去重
            if(i > 0 && num[i]==num[i-1]){
                continue;
            }

            //3.3 双指针夹逼寻找另外两个数
            int sum = -num[i];
            int left = i + 1;
            int right = num.length - 1;

            while(left < right){
                if(num[left] + num[right] == sum){
                    //1. 第一组结果
                    ArrayList<Integer> list = new ArrayList<>();
                    list.add(num[i]);
                    list.add(num[left]);
                    list.add(num[right]);
                    res.add(list);

                    //2. 寻找其他结果组,对left和right去重
                    while(left < right && num[left] == num[left+1]){
                        left++;
                    }
                     while(left < right && num[right] == num[right -1 ]){
                        right--;
                    }

                    left++;
                    right--;

                }else if(num[left] + num[right] > sum){
                    right--;
                }else if(num[left] + num[right] < sum){
                    left++;
                }
            }
        }

        return res;
    }
}