import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        if(num.length<3) return list;
        int[] A = new int[201]; //创建201个桶
        for(int i : num) A[i+100]++; //使所有元素为非负,且统计个数
        
        for(int i = 0;i<201;i++){
            if(A[i]==0) continue;
            A[i]--;
            for(int j = 0;j<201&&(i+j)<301;j++){
                if(A[j]==0) continue;
                A[j]--;
                if(A[300-i-j]>0){ // 由于前面每个元素+100,因此需寻找和为300的
                    int tmp1[] = new int[]{i-100,j-100,200-i-j};//恢复为原始元素
                    Arrays.sort(tmp1);
                    ArrayList<Integer> tmp = new ArrayList<Integer>();
                    tmp.add(tmp1[0]);
                    tmp.add(tmp1[1]);
                    tmp.add(tmp1[2]);
                    if(list.contains(tmp)){}//若已包含,则不再add
                    else
                        list.add(tmp);
                    
                }
                A[j]++;
            }
            A[i]++;
        }
        
        return list;
    }
}