class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
        unordered_map<int,int> um;
        sort(num.begin(),num.end());
        for(auto &n:num) um[n]++;
        set<vector<int>> res;
        for(int i=0;i<num.size();i++){
            um[num[i]]--;
            if(um[num[i]] == 0) um.erase(num[i]);
            unordered_map<int,int> t = um;
            for(int j=i+1;j<num.size();j++){
                t[num[j]]--;
                if(t[num[j]] == 0) t.erase(num[j]);
                if( t[0-num[i]-num[j]] > 0 )
                    res.insert({num[i],num[j],-num[i]-num[j]});
            }
        }
        
        return vector<vector<int>>(res.begin(),res.end());
    }
};