#include <unordered_set> class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { int n = num.size(); if(n==0) 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) // { // 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); // if(c==a || c==b) // { // if(c==a) // { // if(st[a]<2) // continue; // } // if(c==b) // { // if(st[b]<2) // continue; // } // if(c==a && c==b) // { // if(st[c]<3) continue; // } // } // int t = st.count(c); // if(t!=0 && c>=b ) // { // if(a==prea && b==preb) // { // continue; // } // ans.push_back({a,b,c}); // // st[a]--; // // st[b]--; // // st[c]--; // prea = a; // preb = b; // prec = c; // } // } // } for(auto [a,y]:st) { for(auto [b,z]:st) { int c = -(a+b); if(a<=b && b<=c && st.count(c)>0) { if(a==b && b==c && st[c]>=3) { ans.push_back({a,b,c}); } if(a==b && b<c && st[a]>=2) { ans.push_back({a,b,c}); } if(a<b && b==c && st[b]>=2) { ans.push_back({a,b,c}); } if(a<b && b<c) { ans.push_back({a,b,c}); } } } } return ans; } };
使用了map 但这样最后 时间复杂度是O(n^2logn)
之前用数组遍历没有通过 涉及去重的问题
vector<vector<int> > threeSum(vector<int> &num) { int n = num.size(); if(n==0) 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) { 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;