给你一个整数数组
nums
,判断是否存在三元组[nums[i], nums[j], nums[k]]
满足i != j
、i != k
且j != k
,同时还满足nums[i] + nums[j] + nums[k] == 0
。请你返回所有和为
0
且不重复的三元组。注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 解释: nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。 nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。 nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。 不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。 注意,输出的顺序和三元组的顺序并不重要。示例 2:
输入:nums = [0,1,1] 输出:[] 解释:唯一可能的三元组和不为 0 。示例 3:
输入:nums = [0,0,0] 输出:[[0,0,0]] 解释:唯一可能的三元组和为 0 。提示:
3 <= nums.length <= 3000
-105 <= nums[i] <= 105
第一次写的时候没想到先排序,写的确实是构式。
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> res;
unordered_map<int, vector<vector<int>>> sum_2;
unordered_map<string, int> res_m;
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (sum_2.find(nums[j]) != sum_2.end())
{
vector<vector<int>> cur_vv = sum_2.find(nums[j])->second;
for (int k = 0; k < cur_vv.size(); k++) {
vector<int> cur_v = cur_vv[k], cur_res;
if (j == cur_v[2] || j == cur_v[3]) continue;
cur_res.push_back(nums[j]);
cur_res.push_back(cur_v[0]);
cur_res.push_back(cur_v[1]);
sort(cur_res.begin(), cur_res.end());
string cur_str = to_string(cur_res[0]) + to_string(cur_res[1]) + to_string(cur_res[2]);
if (res_m.find(cur_str) == res_m.end()) {
res.push_back(cur_res);
res_m.insert(make_pair(cur_str, 1));
}
}
}
else {
vector<int> cur_v = { nums[i], nums[j], i, j };
int num = -nums[i] - nums[j];
if (sum_2.find(num) == sum_2.end() ){
vector<vector<int>> cur_vv;
cur_vv.push_back(cur_v);
sum_2.insert(make_pair(num, cur_vv));
}
else {
sum_2.find(num)->second.push_back(cur_v);
}
}
}
}
return res;
}
第二次用排序之后,用二重循环加哈希表,感觉是o(n)的复杂度,但是只打败很少的人,水平所限先就这样吧。