class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > findTriplets(vector<int>& nums) {
        // write code here
        sort(nums.begin(), nums.end()); // 对数组进行排序以方便去重
        set<vector<int>> tripletSet; // 使用set来自动去重
        //上面两个去重,说的是[set1[], set2[], set3[]]里的各个set之间不能重复
        int len = nums.size();
	  //           <value, index>
        unordered_map<int, int> map;

        for (int i = 0; i < len; ++i) {
            map.clear();
            for (int j = i + 1; j < len; ++j) {
                int complement = -nums[i] - nums[j];
                if (map.find(complement) != map.end()) {
                    tripletSet.insert({nums[i], complement, nums[j]});
                }
                map[nums[j]] = j;//后于insert加入,维持complement < nums[j]
            }
        }

        vector<vector<int>> ret(tripletSet.begin(), tripletSet.end());
        return ret;
    }
};