LeetCode:78 子集 回溯法

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

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

示例:

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/subsets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

在区间[begin, end]中取n个数字,问题转换为:

  • 在区间[begin, i]中取一个数 + 在区间[i+1, end]中取n-1个数

穷举所有可能的i,列出结果,因为给定的数组没有重复的元素,下标不同则元素不同,可以直接按照上述规则取元素

代码

x     :现在取到第几个数了
len   :要取的数的数目
begin :区间[begin, end]的左端点,右端点表示数组结尾
nums  :题目给定数组
temo  :用来保存一次答案的临时数组
class Solution {
public:
    vector<vector<int>> ans;
    void dfs(int x, int len, int begin, vector<int>& nums, vector<int>& temp)
    {
        if(x==len)
            ans.push_back(temp);
        for(int i=begin; i<nums.size(); i++)
        {
            temp.push_back(nums[i]);
            dfs(x+1, len, i+1, nums, temp);
            temp.pop_back();
        }
    }
    vector<vector<int>> subsets(vector<int>& nums)
    {
        vector<int> t;
        for(int i=0; i<=nums.size(); i++)
            dfs(0, i, 0, nums, t);
        return ans;
    }
};
发布了171 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44176696/article/details/104523334