Given a set of distinct integers, nums, return all possible subsets (the power set).
Example:
Input: nums = [1,2,3]Output:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]
code1:
recursion:对于个数字都有拿与不拿两种情况;如果拿后面对应一种情况,如果不拿后面又对应一种情况,可用recursion
class Solution{private: void subsets(int start,vector &nums,vector &tmp,vector> &res) { if(start==nums.size()) { res.push_back(tmp); return ; } tmp.push_back(nums.at(start)); subsets(start+1,nums,tmp,res); tmp.pop_back(); subsets(start+1,nums,tmp,res); return ; }public: vector > subsets(vector & nums) { if(nums.empty()) return {}; vector > res; vector tmp; subsets(0,nums,tmp,res); return res; }};
code2:
对于{1,2,3}这个数组
- 首先空集{}肯定是一个子集(因为空集是任何集合的子集),此时res中有一个元素为{}
- 对于元素1,res就是{}和{1}
- 对于元素2,把前面的res中的每个元素中加上2,就得到含有2的所有的情况
- ......
class Solution{public: vector> subsets(vector & nums) { if(nums.empty()) return {}; vector > res; vector tmp; res.push_back(tmp); for(int i=0;i
code3:
位运算;每个元素都可能出现或不出现,故每个元素有两种情况,所以对于{1,2,3}来讲,结果数组中共有2^3=8中情况。每个子集的序号的二进制表示,把是1的位对应原数组中的数字取出来就是一个子集,八种情况都取出来就是所有的子集了
出来就是一个子集,八种情况都取出来就是所有的子集了,参见代码如下:
1 | 2 | 3 | Subset | |
0 | F | F | F | [] |
1 | F | F | T | 1 |
2 | F | T | F | 2 |
3 | T | T | F | 1,2 |
4 | F | F | T | 3 |
5 | T | F | T | 1,3 |
6 | F | T | T | 2,3 |
7 | T | T | T | 1,2,3 |
class Solution{public: vector> subsets(vector & nums) { if(nums.empty()) return {}; int size=1<
常见的位操作: