子集问题

给定一组不含重复元素的整数数组 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;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43425693/article/details/89948178