78-子集
Posted nxnslc-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; } };
相关知识点链接:
1:https://blog.csdn.net/qq531958586/article/details/82928316
以上是关于78-子集的主要内容,如果未能解决你的问题,请参考以下文章