给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
解法一:
回溯法:时间复杂度o(2^n),空间复杂度o(n);
void recursion(int n,vector<int>& nums,vector<int>& tmp,vector<vector<int>>& res)
{
if(n==nums.size())
{
res.push_back(tmp);
return;
}
recursion(n+1,nums,tmp,res);//对除去当前元素的部分的子集
tmp.push_back(nums[n]);//加入当前元素
recursion(n+1,nums,tmp,res);//加入当前元素求子集
tmp.pop_back();//下一种情况
}
vector<vector<int>> subsets(vector<int>& nums)
{
if(nums.size()==0)return vector<vector<int>>();
vector<vector<int>>res;
vector<int>tmp;
recursion(0,nums,tmp,res);
return res;
}
解法二:
依次加入数组,每一次扩充临时数组,再将临时数组加入结果数组
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums)
{
vector<vector<int>>res;
vector<vector<int>>temp;
res.push_back(vector<int>());//初始化
int len=nums.size();
for(int i=0;i<len;i++)
{
temp=res;
for(int j=0;j<temp.size();j++)
{
temp[j].push_back(nums[i]);//一次次遍历放入数组存储
res.push_back(temp[j]);
}
}
return res;
}
};