思路
换个方法想问题。
有n个数,每个数是否作为输出用0/1状态来表示,比如[1,2,3]全出现就是(1,1,1) => 7,那n个元素的子数组的生成就是以下过程:[0, 2^n)里的每个数i,看这个数i里第[0,n)位是否为1,若为1则表示nums[i]被选中了,否则不选。
比如[1,2,3]的所有子集:
[ [1, 2, 3] [3], => 0, 0, 1 => 1 [1], => 1, 0, 0 => 4 [2], => 0, 1, 0 => 2 [1,2,3], => 1, 1, 1 => 7 [1,3], => 1, 0, 1 => 5 [2,3], => 0, 1, 1 => 3 [1,2], => 1, 1, 0 => 6 [] => 0, 0, 0 => 0 ]
代码
class Solution { public: vector<int> decodeMask(unsigned int mask, const vector<int>& nums){ vector<int> result; unsigned int tester = 0x1; for(unsigned int i=0; i<nums.size(); i++){ if(mask & tester){ result.push_back(nums[i]); } tester <<= 1; } return result; } vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> results; const unsigned int MAX_MASK = pow(2, nums.size()); for(unsigned int mask=0; mask < MAX_MASK; mask++){ results.push_back(decodeMask(mask, nums)); } return results; } };