数组 4Sum
来源:互联网 发布:g代码编程实例图片 编辑:程序博客网 时间:2024/06/07 05:45
思想:
方法一:
先排序再左右夹逼,时间复杂度O(n^3),但会TLE。
//4Sum O(n^3)vector<vector<int>> fourSum(vector<int> &num, int target) { vector<vector<int>> result; if(num.size()<4) return result; sort(num.begin(),num.end()); auto last = num.end(); for(auto a = num.begin(); a < prev(last,3); a++) { for(auto b = next(a); b < prev(last,2); b++) { auto c = next(b); auto d = prev(last); while(c<d) { const int sum = *a+*b+*c+*d; if(sum<target) { c++; }else if(sum>target) { d--; }else { result.push_back({*a,*b,*c,*d}); ++c; --d; } } } } sort(result.begin(),result.end()); result.erase(unique(result.begin(), result.end()), result.end()); return result;}
方法二:
先用hashmap缓存两两数的和:key为和,value为下标对<a,b>。
然后找另外两个数(下标为c,d),满足总和为0:
如果找到下标为a,b,c,d顺序的四数保留(a,b,c,d互不相等)
最后去重。
时间复杂度:O(n^2)
class Solution {public: vector<vector<int> > fourSum(vector<int> &num, int target) { vector<vector<int>> result; if(num.size() < 4) return result; sort(num.begin(),num.end()); unordered_map<int,vector<pair<int,int>>> cache; for(size_t a = 0; a < num.size(); ++a) { for(size_t b = a+1; b < num.size(); ++b) { cache[num[a]+num[b]].push_back(pair<int,int>(a,b)); } } for(size_t c = 0; c < num.size(); ++c) { for(size_t d = c+1; d < num.size(); ++d) { const int key = target - num[c] - num[d]; if(cache.find(key) == cache.end()) continue; const auto &vec = cache[key]; for(size_t k = 0; k < vec.size(); ++k) { if(c <= vec[k].second) continue; result.push_back({num[vec[k].first], num[vec[k].second], num[c], num[d]}); } } } sort(result.begin(), result.end()); result.erase(unique(result.begin(),result.end()),result.end()); return result; }};
0 0
- 数组 4Sum
- [leetcode] 【数组】18. 4Sum
- 程序员面试题目总结--数组(27)【Two Sum 、3Sum、3Sum Closest 、4Sum】
- 数组—— 2 sum, 3 sum, 3 sum closed, 4Sum.
- 数组之2Sum,3Sum,4Sum,3Sum closest总结
- 【数组】Two Sum
- 数组 Two Sum
- 数组 3Sum
- 数组 3Sum Closest
- Leetcode Two Sum (数组)
- 数组--sum问题
- sum(树状数组)
- Wannafly模拟赛4 C Sum(树状数组)
- 4Sum:带重复数组取值求和
- 【Leetcode】4Sum (Sum)
- Two Sum -- LeetCode [数组类]
- Three Sum -- LeetCode [数组类]
- POJ 1844:Sum ”滚动“数组
- 在linux的shell中/bin/true是什么意思?
- COL命令详解
- Java包命名规则引发的思考
- ubuntu 配置 pptpd关键项目
- ajax跨域调用
- 数组 4Sum
- Sqrt(x) -- leetcode
- linux常见服务端口
- 报文交换数据小练习
- 神秘顾客观质量控制要点
- 注解框架---AndroidAnnotations
- Android FragmentManage FragmentTransaction介绍
- SharePoint 2010自定义母版页小技巧——JavaScript和CSS引用
- 游戏机制新设计工具(Machinations)工作原理