class Solution {
  public:
    vector<vector<int> > threeSum(vector<int>& num) {
        if (num.size() < 3)
            return vector<vector<int>>();
        unordered_map<int, int> occurence;
        unordered_map<int, int> max_pos;
        sort(num.begin(), num.end());
        for (int i = 0; i < num.size(); i++) {
            occurence[num[i]]++;
            if (max_pos.count(num[i]) == 0)
                max_pos[num[i]] = i;
            else
                max_pos[num[i]] = max(max_pos[num[i]], i);
        }
        int last_i = -200;
        vector<vector<int>> ret;
        for (int i = 0; i < num.size() - 1; i++) {
            if (num[i] == last_i)
                continue;
            else {
                last_i = num[i];
                int last_j = -200;
                for (int j = i + 1; j < num.size() - 1; j++) {
                    if (num[j] == last_j)
                        continue;
                    else {
                        last_j = num[j];
                        int cur_target = -num[i] - num[j];
                        if (occurence.count(cur_target) == 0)
                            continue;

                        int need = 1;
                        if (num[i] == cur_target)
                            need++;
                        if (num[j] == cur_target)
                            need++;
                        if (occurence[cur_target] >= need) {
                            if (max_pos[cur_target] > j) {
                                vector<int> cur_entry = {num[i], num[j], cur_target};
                                ret.emplace_back(move(cur_entry));
                            }
                        }
                    }
                }
            }
        }
        return ret;
    }
};
首先确保你先明白了两数之和怎么做。

然后,本题去重的关键在于保证下标单调递增,选出来的数索引(也就是你用三重循环时的k)是不能小于等于j的。不过此处k可以通过哈希表直接生成出来,内层for可以不要,平方级别复杂度