淦78. 子集

这篇博客介绍了如何通过回溯算法解决找到一个不含重复元素的整数数组的所有子集(幂集)问题。以输入数组[1, 2, 3]为例,展示了递归树的结构,并提供了相应的C++代码实现。算法在遍历到数组最后一个元素时将当前子集加入结果集,然后回溯到上一层,继续选择或不选择当前元素,以生成所有可能的子集。
摘要由CSDN通过智能技术生成

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

Claim:解集不能包含重复的子集。

Example:

输入: nums = [1,2,3]
输出:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]

Thinking:

示例输入的递归树

如上图递归树所示,采用回溯算法,依次选取输出数据,当输出到最后一个数据后返回上一层继续选取输出数据 。

code:

class Solution {
public:
    vector<vector<int>> ans; //存储最终结果
    vector<int> tmp;

    void find_subsets(vector<int>& nums, int i)
    {
        if(i == nums.size()) //选取到最后一个数据
        {
            ans.push_back(tmp);
            return;
        }
        tmp.push_back(nums[i]); 

        find_subsets(nums, i+1); //进入下一层
        tmp.pop_back();           //退回上一层
        find_subsets(nums, i+1);  //继续选取数据
    }

    vector<vector<int>> subsets(vector<int>& nums) {
        find_subsets(nums, 0);
        return ans;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值