4Sum
来源:互联网 发布:淘宝买家号开店 编辑:程序博客网 时间:2024/05/29 14:19
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note:
- Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
- The solution set must not contain duplicate quadruplets.
For example, given array S = {1 0 -1 0 -2 2}, and target = 0. A solution set is: (-1, 0, 0, 1) (-2, -1, 1, 2) (-2, 0, 0, 2)
注意该问题的答案中,每个quadruplet内部可以有重复的数字,但quadruplet之间不能重复。即每个quadruplet内四个元素对应的index不能重复。本文给出两种解法。
解法一,先排序,然后用一个hashmap记录每两两个数的和和这两个数对应的index(注意是index而不能仅仅记录这两个数,防止重复)。时间复杂度,平均O(n^2),最坏O(n^4),空间O(n^2)。最后对结果sort并去重。代码如下。
class Solution {public: vector<vector<int> > fourSum(vector<int> &num, int target) { vector<vector<int> > result; const int len = num.size(); if(len < 4) return result; sort(num.begin(), num.end()); unordered_map<int, vector<pair<int, int> > > cache; for(int i=0; i<len; i++) for(int j=i+1; j<len; j++) cache[num[i]+num[j]].push_back(pair<int,int>(i, j)); for(int i=0; i<len; ++i) { for(int j=i+1; j<len; ++j) { int left = target-num[i]-num[j]; if(cache.find(left) == cache.end()) continue; vector<pair<int,int> > t = cache[left]; for(int k=0; k<t.size(); ++k) { if(i <= t[k].second) continue; result.push_back({num[t[k].first], num[t[k].second], num[i], num[j]}); } } } sort(result.begin(), result.end()); result.erase(unique(result.begin(), result.end()), result.end()); return result; }};
解法二,仍然使用hash, 时间O(n^2), 空间O(n^2)。先缓存没两个数的和,然后遍历hash,根据sum2在常数时间内找出另一个sum2,然后遍历两个sum2对应的list,根据其pair组成四元组。代码如下所示。
class Solution {public: vector<vector<int> > fourSum(vector<int> &num, int target) { vector<vector<int> > result; const int len = num.size(); if(len < 4) return result; sort(num.begin(), num.end()); unordered_map<int, vector<pair<int, int> > > cache; for(int i=0; i<len; i++) for(int j=i+1; j<len; j++) cache[num[i]+num[j]].push_back(pair<int,int>(i, j)); unordered_map<int, vector<pair<int, int> > >::iterator it = cache.begin(); for(; it != cache.end(); ++it) { int left = target-it->first; if(cache.find(left) == cache.end()) continue; vector<pair<int, int> > v1 = it->second; vector<pair<int, int> > v2 = cache[left]; for(int i=0; i<v1.size(); ++i) for(int j=0; j<v2.size(); ++j) { auto a = v1[i].first; auto b = v1[i].second; auto c = v2[j].first; auto d = v2[j].second; if(b < c) result.push_back({num[a], num[b], num[c], num[d]}); } } sort(result.begin(), result.end()); result.erase(unique(result.begin(), result.end()), result.end()); return result; }};
参考(求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)):http://tech-wonderland.net/blog/summary-of-ksum-problems.html
0 0
- 【Leetcode】4Sum (Sum)
- leetcode 2 sum 3sum 4sum
- 3Sum 3Sum Closest 4Sum
- 3Sum & 3Sum Closest & 4Sum
- 2Sum 3Sum 4Sum
- 3sum、3Sum closet、 4sum
- 3Sum, 3Sum Closest, 4 Sum
- Leetcode 2SUM-3SUM-4SUM
- Leetcode-2sum,3sum,4sum
- leetcode 2 sum & 3 sum & 4 sum
- 4Sum
- 4Sum
- 4Sum
- 4Sum
- 4Sum
- 4Sum
- 4Sum
- 4Sum
- 使用openssl解密c#的DESCryptoServiceProvider的密文
- 【LeetCode】Binary Tree Preorder Traversal
- Windows核心编程(七)用户模式下的线程同步
- delphi中cardinal类型
- 在安卓下控制基于树莓派的小车 皆用python实现
- 4Sum
- 关于Python Package下的Module import方式
- 将tomcat、Nginx、memcache、MongoDB等免安装软件注册成win系统的服务
- matching_to_many_images运行错误
- Ruby on Rails 新建Bolg项目
- linux网络编程二:基础socket, bind, listen, accept, connect
- 新长城 郁闷的一道面试题(把C盘文件复制到D盘)
- Oracle 字段类型
- 零佣金面世 互联网金融改写券商经纪版图