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的主要内容,如果未能解决你的问题,请参考以下文章

018. 4Sum

LeetCode018 4Sum

LeetCode-018-四数之和

18. 4Sum

LeetCode——4Sum &amp; 总结

4Sum -- LeetCode