[leetcode] 78.Subsets
2015-08-26 22:21
435 查看
题目:
Given a set of distinct integers, nums, return all possible subsets.
Note:
Elements in a subset must be in non-descending order.
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],
[]
]
题意:
给定一个数组包含不相同的元素,找出所有的子集。
思路:
我们知道对于这种所有元素都不同的集合,所有的子集的个数就是2^n,这n个数每个数都有可能在里面也有可能不在里面。最金典的方法是使用位操作,我们使用一个数,让这个数从0变化到2^n - 1,所以这个数可能的变化范围是0~0(n个0)到1~1(n 个1),这n个位置上的二进制如果是0代表的是不包含这个元素,如果是1则代表的是包含这个元素。
代码如下:
2.当然,我们也可以使用回溯的方法来做这道题目。我们这样思考,对于有n个数,我们依旧使用0,1代表是否使用了这个数在子集中。那么对于第0位上的数字,nums[0],如果选择了那么就代表这个位上是1,如果没有选择则代表这个位上是0。如果这一位是1,那么后面的n-1位再去确定,如果是0的话,那么其后面n-1位上所有的可能是什么呢?组成二进制的话,可以是01…, 001…, 00…0。 也就是说,我们可以选择第n-1直到第0位,或者后面一个都不选。如果选择了第n-1位的话,那么接下来递归的在剩下的n-2个元素中继续操作。
以上。
代码如下:
Given a set of distinct integers, nums, return all possible subsets.
Note:
Elements in a subset must be in non-descending order.
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],
[]
]
题意:
给定一个数组包含不相同的元素,找出所有的子集。
思路:
我们知道对于这种所有元素都不同的集合,所有的子集的个数就是2^n,这n个数每个数都有可能在里面也有可能不在里面。最金典的方法是使用位操作,我们使用一个数,让这个数从0变化到2^n - 1,所以这个数可能的变化范围是0~0(n个0)到1~1(n 个1),这n个位置上的二进制如果是0代表的是不包含这个元素,如果是1则代表的是包含这个元素。
代码如下:
class Solution { public: vector<vector<int> > subsets(vector<int> &S) { vector<vector<int> >result; if (S.size() == 0)return result; sort(S.begin(), S.end()); unsigned long subset_number = pow(2, S.size());//there are total 2^n subset for (unsigned long i = 0; i < subset_number; i++){ result.push_back(subset(i,S)); } return result; } vector<int> subset(unsigned long l, vector<int> & S){ vector<int> result; size_t i = 0; while (l){ if (l & 0x01) result.push_back(S[i]); l >>= 1; i++; } return result; } };
2.当然,我们也可以使用回溯的方法来做这道题目。我们这样思考,对于有n个数,我们依旧使用0,1代表是否使用了这个数在子集中。那么对于第0位上的数字,nums[0],如果选择了那么就代表这个位上是1,如果没有选择则代表这个位上是0。如果这一位是1,那么后面的n-1位再去确定,如果是0的话,那么其后面n-1位上所有的可能是什么呢?组成二进制的话,可以是01…, 001…, 00…0。 也就是说,我们可以选择第n-1直到第0位,或者后面一个都不选。如果选择了第n-1位的话,那么接下来递归的在剩下的n-2个元素中继续操作。
以上。
代码如下:
class Solution { public: vector<vector<int> > subsets(vector<int> &S) { if(S.size() == 0)return result; sort(S.begin(), S.end()); this->S = S; this->size = S.size(); subsets(0); return result; } void subsets(int index) { result.push_back(temp); for(int i = index; i < size; i++) { temp.push_back(S[i]); subsets(i + 1);//只能在剩下的元素中递归 temp.pop_back(); } } private: vector<int> S; vector<vector<int>> result; vector<int> temp; int size; };
相关文章推荐
- Qt中的多线程技术
- hdu3388容斥原理
- 06 java.lang.AbstractStringBuilder
- Kids and Prizes 来源: <http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85996#problem/B>
- Android UI设计——AutoCompleteTextView
- 新增属性选择器
- java 大数计算
- 2015-08-26
- 自定义组合控件的使用
- 两道几何题的求解
- R 语言 ubantu配置以及安装
- Broadcast广播机制
- ArcGIS 10.3编译旧版本Addin错误的解决办法
- Android基础&进阶
- HDU1059 多重背包 多重部分和问题DP
- 深入剖析Tomcat类加载机制
- poj1184 聪明的打字员 BFS+剪枝
- 合并两个排序的链表
- Java多线程 -- 有返回值的线程
- JVM调优总结 -Xms -Xmx -Xmn -Xss