题解 | 三数之和
三数之和
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711
#include <unordered_map>
#include <vector>
#include <algorithm> // 仅补充sort必需头文件(编译依赖)
using namespace std; // 仅补充命名空间(编译依赖)
class Solution {
public:
vector<vector<int> > threeSum(vector<int>& num) {
vector<int>vec;
vector<vector<int>>result;
unordered_map<int, int>map;
int left, right, target;
sort(num.begin(), num.end());
for (int i = 0; i < num.size(); i++) {
if (i - 1 >= 0 && num[i - 1] == num[i]) continue;
target = -1 * num[i];
left = i + 1;
right = num.size() - 1;
map.clear(); // 每次i循环清空哈希表(核心修复)
for (int j = left; j <= right; j++) {
int bu = target - num[j];
if (map.count(bu)) {
vec.push_back(num[i]);
vec.push_back(bu);
vec.push_back(num[j]);
result.push_back(vec);
vec.clear();
continue; // 找到后跳过当前j的map插入(避免重复)
}
vec.clear();
map[num[j]] = j;
// 将去重移到map操作之后,避免跳过[0,0,0]的匹配
if (j > left && num[j - 1] == num[j]) {
// 找到重复后,若已命中则需要去重结果,这里先保证匹配能执行
continue;
}
}
}
//去重结果(修复重复三元组问题,最小改动)
sort(result.begin(), result.end());
result.erase(unique(result.begin(), result.end()), result.end());
return result;
}
};
查看21道真题和解析