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());
}
};