[Leetcode] Subsets
来源:互联网 发布:ftp服务器端软件 编辑:程序博客网 时间:2024/06/04 23:34
描述
Given a set of distinct integers, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3], a solution is:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]
分析1
要求写出集合的所有子集。
子集的生成过程是这样子的:对于原集合中的每个元素,都有两种状态,一种是放入子集中,另一种是不放入子集中,当我们决定了原来集合中所有元素的状态后,我们便确定了一个子集。
对于元素个数为
[] / \ / \ / \ [] [1] / \ / \ / \ / \ [] [2] [1] [1 2] / \ / \ / \ / \ [] [3] [2] [2 3] [1] [1 3] [1 2] [1 2 3]
根据这个思路,我们能写出递归的代码出来,如下所示。
代码1
class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res; vector<int> tmp; sort(nums.begin(), nums.end()); getSubsets(nums, 0, tmp, res); return res; } void getSubsets(vector<int>& nums, int i, vector<int> tmp, vector<vector<int>>& res) { if (i == nums.size()) {res.push_back(tmp); return;} getSubsets(nums, i + 1, old, res); tmp.push_back(nums[i]); getSubsets(nums, i + 1, tmp, res); }};
分析2
另外一种递归的写法,思路大同小异。
代码2
class Solution {public: vector<vector<int>> subsets(vector<int>& S) { sort(S.begin(), S.end()); vector<vector<int>> res; vector<int> out; toSet(S, 0, out, res); return res; } void toSet(vector<int>& S, int pos, vector<int>& out, vector<vector<int>>& res) { res.push_back(out); for (int i = pos; i < S.size(); i++) { out.push_back(S[i]); toSet(S, i + 1, out, res); out.pop_back(); } }};
分析3
还是上面的思路,换一种思考方式,假设我们现在已经有了前
1. 不添加进子集,这种情况下的
2. 添加进子集,这种情况下就是把这个元素添加进
因此我们可以首先把空集放入
代码3
class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res(1); sort(nums.begin(), nums.end()); for (int i = 0; i < nums.size(); i++) { int size = res.size(); for (int j = 0; j < size; j++) { res.push_back(res[j]); res[size + j].push_back(nums[i]); } } return res; }};
分析4
另外一种思路,我们将每个元素的两种状态用
代码4
class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res; sort(nums.begin(), nums.end()); int n = 1 << nums.size(); for (int i = 0; i < n; i++) res.push_back(toSet(nums, i)); return res; } vector<int> toSet(vector<int>& nums, int k) { vector<int> res; for (int i = 0; i < nums.size(); i++, k = k >> 1) { if (k % 2 == 1) res.push_back(nums[i]); } return res; }};
- 【LeetCode】 Subsets Subsets II
- 【LeetCode】Subsets & Subsets II
- LeetCode Subsets && Subsets II
- LeetCode Subsets && Subsets II
- LeetCode-Subsets & Subsets II
- LeetCode: Subsets
- LeetCode Subsets
- [Leetcode] Subsets
- LeetCode : Subsets
- [LeetCode] Subsets
- Leetcode: Subsets
- Leetcode: Subsets ||
- [leetcode] subsets
- Leetcode - Subsets
- [LeetCode]Subsets
- LeetCode-Subsets
- LeetCode - Subsets
- LeetCode | Subsets
- Spring Data JPA 入门学习笔记
- linux 内核编译
- 面试总结(一)
- iOS中使用RSA对数据进行加密解密
- Python 文件读写操作实例详解
- [Leetcode] Subsets
- 编写Python程序时10个常见的错误
- Spring 中 LazyConnectionDataSourceProxy 代理类的源码解析
- css中zoom与transform:scale()的区别
- 关于跳转到空白页面进行新浪微博分享,当点击取消保存到草稿时无法监听,返回空白页问题的解决方案
- WordCountTopology的实现
- python 2.7 : 引用模块时出现TypeError:'module' object is not callable
- linux shell 指令 诸如-d, -f, -e之类的判断表达式
- ubuntu下hive安装(整合hadoop,mysql)