题解 | #三数之和#
三数之和
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711
class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { unordered_multimap<int, int> themap; vector<vector<int>> res; //先将数组存到map中,这样将复杂度降到O(n^2) for (int i = 0; i < num.size(); ++i) { themap.insert(make_pair(num[i], i)); } //两层循环计算nums[i]+nums[j],并寻找nums[k] for (int i = 0; i < num.size(); ++i) { for (int j = i + 1; j < num.size(); ++j) { auto range = themap.equal_range(-(num[i] + num[j]));//这里返回的是一个pair for(auto it=range.first;it!= range.second;++it) { if (it->second != i && it->second != j)//不能重复使用同一个索引 { vector<int> tmpres{num[i],num[j],it->first}; sort(tmpres.begin(), tmpres.end()); res.push_back(tmpres); } } } } //去重 //排序 sort(res.begin(), res.end(), [](const vector<int>& p1,const vector<int>& p2)->bool{ //按照从左到右比大小的顺序排列 for (int i = 0; i < 3; ++i) { if (p1[i] < p2[i]) { return true; } else if(p1[i]==p2[i]) { continue; } else { return false; } } return false; }); vector<vector<int>> termres; if(res.empty()) return res; //去除相同的元素,此时相同的元素都是相邻的 termres.push_back(*res.begin()); for (auto it = res.begin(); it != res.end(); ++it) { if (*it != termres[termres.size() - 1]) termres.push_back(*it); } return termres; } };
这个方法在原数组中有元素大量重复的时候使用unordered_multimap的查询复杂度会变成O(n),不再是O(1),这样综合下来复杂度变成了O(n^3),所以这个方法可能通不过测试