程序员面试金典 8.4

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个,可以和一个二进制数唯一对应,所以页可以枚举从0UINT_MAX的每一个二进制数,根据该二进制数生成子集。

发布了194 篇原创文章 · 获赞 2 · 访问量 7718

猜你喜欢

转载自blog.csdn.net/RayoNicks/article/details/105451831
8.4
今日推荐