LeetCode刷题_c++版-78子集

法一:递归

class Solution {
    
    
public:
    //使用递归和回溯的思想实现
    vector<vector<int>> result;

    void generate(vector<int> nums, vector<int> tmp,int i){
    
    
        if(i>= nums.size()) return;
        //不添加当前数字
        generate(nums, tmp, i+1);
        tmp.push_back(nums[i]);
        //添加当前数字,只有集合更新了,才需要添加到result集合里面
        result.push_back(tmp);
        generate(nums, tmp ,i+1);
        return;
    }

    vector<vector<int>> subsets(vector<int>& nums) {
    
    
        vector<int> tmp;
        int i = 0;
        result.push_back(tmp);
        if(nums.size()==0) return result;
        generate(nums,tmp,i);
        return result;

    }
};

在这里插入图片描述
法二:for循环

class Solution {
    
    
public:
    //用for循环的方式实现
    //每个数选与不选,共有2^n种可能
    
    vector<vector<int>> subsets(vector<int>& nums) {
    
    
        vector<vector<int>> result;
        int all = 1<< nums.size();//用一位表示一个数字,1<<nums.size()即为2^n
        for(int i=0; i<all; i++){
    
    
            vector<int> item;
            for(int j=0; j<nums.size(); j++){
    
    
                //相当于100000...(共j个0,二进制)
                //和2^n个i与各位分别相与,如果i!=0,则表示选中该位
                if(i&(1<<j)){
    
    
                    item.push_back(nums[j]);
                }
            }result.push_back(item);
        }
        

        return result;

    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44343355/article/details/128800102