78. 子集

题意

给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入:nums = [1,2,3]
输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]

思路

首先因为题目说不含重复元素,那么可以知道子集总数为C(0, n) + C(1, n) + ... + C(n, n) = 2^n

于是很自然可以想到二进制的全排列,哪一位出现1,则表示该位置数字被选中,例如样例中的三个数字那么二进制全排列为:
000 = [ ]
001 = [ 1 ]
010 = [ 2 ]
011 = [ [1, 2] ]
100 = [ 3 ]
101 = [ [3, 1] ]
...

所以可以根据这个进行枚举0~2^n,然后对每个数字进行拆分。代码如下:

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ans;
        int len = nums.size();
        if(len == 0) return ans;
        int max_num = 1 << len;
        vector<int> tmp_array;
        for (int i=0; i<max_num; i++){
            tmp_array.clear();
            get_now_subset(i, nums, tmp_array);
            ans.push_back(tmp_array);
        }
        return ans;
    }
    void get_now_subset(int now_num, vector<int>& nums, vector<int>& subset){
        int len = nums.size();
        for (int i=0; i<len; i++){
            if (now_num & 1){
                subset.push_back(nums[i]);
            }
            now_num >>= 1;
        }
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 78. 子集给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子...
    杏仁小核桃阅读 1,855评论 0 0
  • 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例...
    佛祖拿屠刀阅读 1,315评论 0 0
  • 题目给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 ...
    HITZGD阅读 1,756评论 0 0
  • <center>#1 Two Sum</center> link Description:Given an arr...
    铛铛铛clark阅读 6,664评论 0 3
  • 代码解答 思路解析 读题分析应该用递归,第一个数与剩余数组合,第二个数与排除第一个数后剩余数组合...到达边界后返...
    jianshujoker阅读 1,382评论 0 0

友情链接更多精彩内容