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)