Loading

78-子集

N位不重复数的子集是2^N个,这里对子集总数表示采用位运算的方法  。例如1<<3=1*2*2*2=8,故可表示为1<<N

需要注意的点:vector<int> res;      直接这么声明的话没有初始值,内部是空的,就是[]这样的形式,所以后续循环输出的时候才能输出空集

思路:建立1到2^N的循环,循环内每个数(二进制)都和nums内的每个数位(1<<j)进行&位运算,即可将对应的位输入vector中,最终输出一个完整的子集,外部循环完毕就是该nums的所有子集。

这里面没想到的点是位运算的表示,使代码优化,读起来更方便。

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        
        vector<vector<int>> res;
        int result=nums.size();
        int N=1<<result;
        for(int i=0;i<N;i++)
        {
            vector<int> v;
            for(int j=0;j<result;j++)
            {
                if(i&(1<<j))               //计算nums的各位中是否和i对应,如果对应,就把num中对应的位输出
                {
                    v.push_back(nums[j]);
                }
                
            }
            res.push_back(v);
        }
        return res;
    }
};
View Code

 

 

相关知识点链接:

1:https://blog.csdn.net/qq531958586/article/details/82928316

2:https://zhidao.baidu.com/question/169077652.html?qbl=relate_question_2&word=%CE%BB%D4%CB%CB%E31%3C%3C8

posted @ 2020-02-29 12:41  是凉城吖  阅读(162)  评论(1编辑  收藏  举报