import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        int len = num.length;  //获取数组长度
        //特殊值处理,如果数组长度小于3,则返回空数组
        if(len < 3){
            return new ArrayList<>(0);
        }
        Arrays.sort(num);  //对原数组排序
        //创建一个哈希集,值为数组中的值,
        HashMap<Integer,Integer> hashMap = new HashMap<>(len);
        //遍历数组,将数组中的数存入哈希集
        for(int i=0;i<len;i++){
            if(hashMap.containsKey(num[i])){
                hashMap.put(num[i],hashMap.get(num[i]) + 1);
            }else {
                hashMap.put(num[i],1);
            }
        }
        ArrayList<ArrayList<Integer>> array = new ArrayList<>();  //创建一个二维数组
        int temp = 0;
        //,二层遍历数组
        for(int i=0;i<len-1;i++){
            for(int j=i+1;j<len;j++){
                temp = 0 - (num[i] + num[j]);  //三个数相加为0
                if(hashMap.containsKey(temp)){  //如果数组中出现三个数相加为0,则保存为数组,并将数组添加到二维数组中
                    if(temp == num[i] && temp == num[j]){
                        if(hashMap.get(temp) >= 3){
                            ArrayList arrayList = new ArrayList(3);
                            int[] arr = new int[3];
                            arr[0] = num[i];
                            arr[1] = num[j];
                            arr[2] = temp;
                            Arrays.sort(arr);
                            for(int k=0;k<3;k++){
                                arrayList.add(k,arr[k]);
                            }
                            array.add(arrayList);
                        }
                    }else if(temp == num[i]){
                        if(hashMap.get(temp) >= 2){
                            ArrayList arrayList = new ArrayList(3);
                            int[] arr = new int[3];
                            arr[0] = num[i];
                            arr[1] = num[j];
                            arr[2] = temp;
                            Arrays.sort(arr);
                            for(int k=0;k<3;k++){
                                arrayList.add(k,arr[k]);
                            }
                            array.add(arrayList);
                        }
                    }else if(temp == num[j]){
                        if(hashMap.get(num[j]) >= 2){
                            ArrayList arrayList = new ArrayList(3);
                            int[] arr = new int[3];
                            arr[0] = num[i];
                            arr[1] = num[j];
                            arr[2] = temp;
                            Arrays.sort(arr);
                            for(int k=0;k<3;k++){
                                arrayList.add(k,arr[k]);
                            }
                            array.add(arrayList);
                        }
                    }else {
                        ArrayList arrayList = new ArrayList(3);
                        int[] arr = new int[3];
                        arr[0] = num[i];
                        arr[1] = num[j];
                        arr[2] = temp;
                        Arrays.sort(arr);
                        for(int k=0;k<3;k++){
                            arrayList.add(k,arr[k]);
                        }
                        array.add(arrayList);
                    }
                }
            }
        }
        //二维数组去重
        for(int i=0;i<array.size()-1;i++){
            for(int j=i+1;j<array.size();j++){
                if(array.get(i).get(0) == array.get(j).get(0) && array.get(i).get(1) == array.get(j).get(1) && array.get(i).get(2) == array.get(j).get(2)){
                    array.remove(j);
                    j--;
                }
            }
        }
        return array;  //返回二维数组
    }
}