import java.util.*;
public class Solution {
    /*
    输入:
             [-10,0,10,20,-10,-40]    
    返回值:
            [[-10,-10,20],[-10,0,10]]
    */
    class Three {
        int one ;
        int two ;
        int three ;
        Three(int a , int b , int c) {
            int[] tmp = {a,b,c} ;
            Arrays.sort(tmp) ;
            one = tmp[0] ;
            two = tmp[1] ;
            three = tmp[2] ;
        }
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof Three)) return false;
            Three a = (Three) o;
            return one == a.one &&
                    two == a.two &&
                    three == a.three;
        }

        @Override
        public int hashCode() {
            return Objects.hash(one, two, three);
        }
    }
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>() ;
        HashSet<Three> set = new HashSet<>() ;
        Arrays.sort(num) ;
        for(int i = 0 ; i < num.length ; i ++) {
            int shen = 0 - num[i] ;
            int s = 0 ;
            int e = num.length - 1 ;
            while(s < e) {
                if(s == i) {
                    s ++ ;
                } else if(e == i) {
                    e -- ;
                } else {
                    int cur = num[s] + num[e] ;
                    if(cur == shen) {
                        Three th = new Three(num[i] , num[s] , num[e]) ;
                        set.add(th) ;
                        int s_old = num[s] ;
                        while(s < e && num[s] == s_old) {
                            s ++ ;
                        }
                        int e_old = num[e] ;
                        while(s < e && num[e] == e_old) {
                            e -- ;
                        }
                    } else if(cur < shen) {
                        s ++ ;
                    } else {
                        e -- ;
                    }
                }
            }
        }
        //处理set
        for(Three t : set) {
            ArrayList<Integer> ele = new ArrayList<>() ;
            ele.add(t.one) ;
            ele.add(t.two) ;
            ele.add(t.three) ;
            res.add(ele) ;
        }
        return res ;
    }
}