018. 4Sum
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了018. 4Sum相关的知识,希望对你有一定的参考价值。
方法一:超时,最坏情况下O(N^4),平均O(N^2)
1 class Solution { 2 public: 3 vector<vector<int>> fourSum(vector<int>& nums, int target) { 4 vector<vector<int>> result; 5 if (nums.size() < 4) return result; 6 map<int, vector<pair<int, int>>> cache; 7 set<vector<int>> res; 8 sort(nums.begin(), nums.end()); 9 for (int i = 0; i < nums.size() - 1; ++i) { 10 for (int j = i + 1; j < nums.size(); ++j) { 11 cache[nums[i] + nums[j]].push_back(pair<int, int>(i, j)); 12 } 13 } 14 for (int i = 0; i < nums.size() - 3; ++i) { 15 for (int j = i + 1; j < nums.size() - 2; ++j) { 16 int gap = target - nums[i] - nums[j]; 17 if (cache.find(gap) != cache.end()) { 18 vector<int> temp; 19 for (auto item : cache[gap]) { 20 temp.clear(); 21 if (i != item.first && i != item.second && j != item.first && j != item.second) { 22 temp = vector<int>{ nums[i], nums[j], nums[item.first], nums[item.second] }; 23 sort(temp.begin(), temp.end()); 24 res.insert(temp); 25 } 26 } 27 } 28 } 29 } 30 result = vector<vector<int>>(res.begin(), res.end()); 31 return result; 32 } 33 };
方法二:O(N^2),不知道问题出在哪里了,仍然超时。。
1 class Solution { 2 public: 3 vector<vector<int>> fourSum(vector<int>& nums, int target) { 4 vector<vector<int>> result; 5 if (nums.size() < 4) return result; 6 else { 7 multimap<int, pair<int, int>> cache; 8 for (int i = 0; i < nums.size() - 1; ++i) { 9 for (int j = i + 1; j < nums.size(); ++j) { 10 cache.insert(pair<int, pair<int, int>>(nums[i] + nums[j], pair<int, int>(i, j))); 11 } 12 } 13 for (const auto& item : cache) { 14 int gap = target - item.first; 15 auto range = cache.equal_range(gap); 16 for (auto i = range.first; i != range.second; ++i) { 17 int a = item.second.first; 18 int b = item.second.second; 19 int c = i->second.first; 20 int d = i->second.second; 21 if (a != c && a != d && b != c && b != d) { 22 vector<int> vec{ nums[a], nums[b], nums[c], nums[d] }; 23 sort(vec.begin(), vec.end()); 24 result.push_back(vec); 25 } 26 } 27 } 28 sort(result.begin(), result.end()); 29 result.erase(unique(result.begin(), result.end()), result.end()); 30 return result; 31 } 32 } 33 };
以上是关于018. 4Sum的主要内容,如果未能解决你的问题,请参考以下文章