给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 要求使用cpp 要求使用三层for循环 并使用undermap对结果去重
时间: 2023-12-21 09:03:12 浏览: 70
你可以使用三层嵌套的 for 循环,并结合使用哈希表来进行去重。以下是满足你要求的代码:
```cpp
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
int len = nums.size();
for (int i = 0; i < len - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue; // 去重
for (int j = i + 1; j < len - 1; j++) {
if (j > i + 1 && nums[j] == nums[j - 1]) continue; // 去重
unordered_map<int, int> hash; // 使用哈希表记录已经遍历过的数
for (int k = j + 1; k < len; k++) {
int target = -nums[i] - nums[j];
if (hash.count(target) > 0 && hash[target] != k) {
vector<int> tmp = {nums[i], nums[j], target};
res.push_back(tmp);
while (k + 1 < len && nums[k] == nums[k + 1]) k++; // 去重
}
hash[nums[k]] = k;
}
}
}
return res;
}
```
这样修改后的代码会使用三层嵌套的循环来遍历所有可能的三元组。同时,使用哈希表来记录已经遍历过的数,以避免重复计算相同的组合。还添加了一些额外的条件来进行去重操作。
阅读全文