1.辅助数组
设置一个保存结果的数组res,首先插入空元素
然后遍历Nums数组,对于数组中的每一个元素,都遍历res中每一个集合res[j],将Nums[i]插如到res[j],然后在插入到res中
如 1 2 3
初始为[]
对1,res为[],插入1,变成[],1
对2,res为[],1 插入2,变成[]、1、2、1 2
对3,res为[]、1、2、1 2 插入3 ,变成[]、1、2、1 2、3、1 3、2 3、1 2 3
代码如下:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
//模拟手动,如数字为3 1初始为[],插入3,则变为[]、3,插入1,则变为[]、3、1、3 1
vector<vector<int>>res;
res.push_back({});
int i=0;
while(i<nums.size())
{
int size=res.size();
for(int j=0;j<size;j++)
{
vector<int> ans(res[j].begin(),res[j].end());
ans.push_back(nums[i]);
res.push_back(ans);
}
i++;
}
return res;
}
};
2.位运算
考虑1 2 3,对于每一个元素都有插入与不插入,设插入对应1 ,不插入对应0,
这里将1 2 3 变为3 2 1 更好理解,如下:
0 0 0 对应0 对应[]
0 0 1 对应1 对应1
0 1 0 对应2 对应2
0 1 1 对应3 对应1 2
1 0 0 对应4 对应3
1 0 1 对应5 对应3 1
1 1 0 对应6 对应3 2
1 1 1 对应7 对应3 2 1
长为len的数组集合个数为Pow(2,len)
代码如下:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
//模拟手动,如数字为3 1初始为[],插入3,则变为[]、3,插入1,则变为[]、3、1、3 1
vector<vector<int>>res;
res.push_back({});
for(int i=1;i<pow(2,nums.size());i++)
{
vector<int> ans;
int num=i,idx=0;
while(num!=0)
{
if((num&1)==1)
ans.push_back(nums[idx]);
num>>=1;
idx++;
}
res.push_back(ans);
}
return res;
}
};