LeetCode之Subsets II
2015-08-03 12:14
344 查看
//递归解法 class Solution { public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<vector<int> > res; if(nums.empty()) return res; sort(nums.begin(), nums.end()); for(int count = 0; count < nums.size()+1; ++count){ vector<int> tmp; subsets_sub(nums, res, tmp, 0, count); } return res; } void subsets_sub(const vector<int> &nums, vector<vector<int> > &res, vector<int> &tmp_res, int start, int count){ /*函数功能:递归获取包含count个数的子数组。*/ if(count == 0){ res.push_back(tmp_res); return; } for(int i = start; i < nums.size();){ if(count <= nums.size()-i){ int n(1); for(int j = i+1; j < nums.size() && nums[j] == nums[i]; ++j) ++n; for(int j = 1; j <= n; ++j){ int k; for(k = 1; k <= j; ++k) tmp_res.push_back(nums[i]); subsets_sub(nums, res, tmp_res, i+n, count-j); while(--k > 0) tmp_res.pop_back(); } i += n; } else break; } } }; //迭代求解 class Solution { public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<vector<int> > res; if(nums.empty()) return res; sort(nums.begin(), nums.end()); res.push_back(vector<int>()); for(int i = 0; i < nums.size();){ int n(0); for(int j = i; j < nums.size() && nums[j] == nums[i]; ++j) ++n; int size = res.size(); for(int k = 1; k < n+1; ++k){ res.reserve(res.size()+size); for(int j = 0; j < size; ++j){ res.push_back(res[(k-1)*size + j]); res[k*size + j].push_back(nums[i]); } } i += n; } return res; } };
相关文章推荐
- 树的直径
- Mysql刷新系统权限表
- Elasticsearch+Logstash+Kibana配置
- POJ 2452 (RMQ + 二分)
- Unreal Engine 4 For Unity Developers
- CWinApp
- 省市联动ajax代码
- UVALive 6042 - Bee Tower(dp)
- SimplewebRTC使用指南
- 支付宝接入记录
- 读书笔记-《 我的成功可以复制》一
- 一句话的设计模式
- leetcode 079 —— Word Search
- AVL树的C语言实现
- hdu2570 迷瘴(贪心)
- 使用Visual Studio开发游戏——微软宣布与Unity、Unreal Engine和Cocos展开全新合作
- java中的serializable接口详解
- 关于二分查找, 关注细节
- LeetCode Anagrams
- Pie