题解 | #三数之和#
三数之和
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711
class Solution {
public:
// 官解 效率更高的 双指针法
vector<vector<int> > threeSum(vector<int>& num) {
int n = num.size();
if (n <= 2)
return {};
vector<vector<int>> ans;
// 对数组排序
sort(num.begin(), num.end());
unordered_map<int, int> st;
// map<int, int> st;
for (int i = 0; i < n; ++i) {
st[num[i]]++;
}
int prea = 101, preb = 101, prec = 101;
for (int i = 0; i < n; ++i) {
if(i>0 && num[i]==num[i-1]) // 关键!
continue;
for (int j = i + 1; j < n; ++j) {
int a = num[i];
int b = num[j];
// if(st[a]<=0 || st[b]<=0)
// continue;
int c = -(a + b);
int t = st.count(c);
if (a <= b && b <= c && t > 0) {
if (a == prea && b == preb)
continue;
if (a == b && b == c && st[c] >= 3) {
ans.push_back({a, b, c});
prea = a;
preb = b;
prec = c;
}
if (a == b && b < c && st[a] >= 2) {
ans.push_back({a, b, c});
prea = a;
preb = b;
prec = c;
}
if (b == c && a < b && st[c] >= 2) {
ans.push_back({a, b, c});
prea = a;
preb = b;
prec = c;
}
if (a < b && b < c) {
ans.push_back({a, b, c});
prea = a;
preb = b;
prec = c;
}
}
}
}
return ans;
}
};
我在自己方法 增加一个去重就通过了
O(n2) O(n)
查看12道真题和解析
汤臣倍健公司氛围 427人发布
