标签:code enter int ... out vector center net 情况
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<int> &nums,vector<int> &tmp,vector<vector<int>> &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<vector<int>> subsets(vector<int>& nums) { if(nums.empty()) return {}; vector<vector<int>> res; vector<int> tmp; subsets(0,nums,tmp,res); return res; } };
code2:
对于{1,2,3}这个数组
class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { if(nums.empty()) return {}; vector<vector<int>> res; vector<int> tmp; res.push_back(tmp); for(int i=0;i<nums.size();++i) { int len=res.size(); for(int j=0;j<len;++j) { tmp=res.at(j); tmp.push_back(nums.at(i)); res.push_back(tmp); } } return res; } };
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<vector<int>> subsets(vector<int>& nums) { if(nums.empty()) return {}; int size=1<<nums.size(); vector<vector<int>> res(size); for(int i=0;i<size;++i) { for(int j=0;j<nums.size();++j) if((i>>j)&0x01) res.at(i).push_back(nums.at(j)); } return res; } };
常见的位操作:https://blog.csdn.net/u014110320/article/details/78713871
标签:code enter int ... out vector center net 情况
原文地址:https://www.cnblogs.com/tianzeng/p/10896970.html