Power Set:编写代码枚举一个集合的所有子集。
根据公式,一个集合一共有2 ^ n
个子集,在结果中,每个元素会出现2 ^ (n - 1)
次,所以总共需要对元素访问n * 2 ^ (n - 1)
次。
为了生成n
个元素的幂集,可以首先生成n - 1
个元素的幂集,然后将第n
个元素加入到n - 1
个元素的幂集中的每个元素中,这样就生成了包含第n
个元素的所有子集,再将这些子集和幂集合并即可,这种思路设计的递归算法时间复杂度为O(n2 ^ n)
。
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
enumSubset(nums, nums.size());
return Subset;
}
private:
vector<vector<int>> Subset;
void enumSubset(const vector<int> &nums, size_t size)
{
if(size == 0){
Subset.push_back(vector<int>());
return;
}
enumSubset(nums, size - 1);
size_t cnt = Subset.size();
for(size_t idx = 0; idx != cnt; idx++)
{
Subset.push_back(Subset[idx]);
Subset.back().push_back(nums[size - 1]);
}
return;
}
};
子集一共有2 ^ n
个,可以和一个二进制数唯一对应,所以页可以枚举从0
到UINT_MAX
的每一个二进制数,根据该二进制数生成子集。