美文网首页
Leetcode78、求子集

Leetcode78、求子集

作者: 残剑天下论 | 来源:发表于2020-05-22 20:03 被阅读0次

1、问题

已知一组数(其中无重复元素),求这组数可以组成的所有子集。 结果中不可有无重复的子集。
例如: nums[] = [1, 2, 3]
结果为: [[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]

2、算法思路

利用回溯方法生成子集,即对于每个元素,都有试探放入或不放入集合中的 两个选择:

  • 选择放入该元素,递归的进行后续元素的选择,完成放入该元素后续所有元素 的试探;
  • 之后将其拿出,即再进行一次选择不放入该元素,递归的进行后续元素的选择,完成不放入该元素后续所有元素的试探。

本来选择放入,再选择一次不放入的这个过程,称为回溯试探法

例如:
元素数组: nums = [1, 2, 3, 4, 5,...] ,子集生成数组item[] = []
对于元素1,
选择放入item,item = [1],继续递归处理后续[2,3,4,5,...]元素;item = [1,...]
选择不放入item,item = [],继续递归处理后续[2,3,4,5,...]元素;item = [...]

3、代码实现

#include <iostream>
#include <vector>

using namespace std;

class Solution
{
public:
    vector< vector<int> > subsets (vector<int>& nums)
    {
        // 回溯法递归
        vector< vector<int> > result;
        vector<int> item;  // 回溯时,产生各个自己的数组
        result.push_back(item);  // 将空集push到result中
        generate(0, nums, item, result);
        return result;
    }
private:
    void generate(int i, vector<int>& nums,
            vector<int>& item,
            vector< vector<int> >& result)
    {
        if (i >= nums.size())
            return;

        item.push_back(nums[i]);  // 将当前元素压入
        result.push_back(item);

        generate(i + 1, nums, item, result);
        item.pop_back();
        generate(i + 1, nums, item, result);
    }
};
int main()
{
    Solution S;

    vector<int> nums;
    nums.push_back(1);
    nums.push_back(2);
    nums.push_back(3);

    vector< vector<int> > res = S.subsets(nums);

    for (int i = 0; i < res.size(); i ++)
    {
        cout << "[";
        for (int j = 0; j < res[i].size(); j ++)
        {
            cout << res[i][j] << ", ";
        }
        cout << "]";
        cout << endl;
    }
    return 0;
}

相关文章

  • Leetcode78子集

    给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例:...

  • LintCode每日一练-限制条件子集

    问题:限制条件子集 给一个数组,给定一个target,求满足以下条件的子集个数:条件:子集中的最小值+最大值小于给...

  • LeetCode78

    题目链接https://leetcode-cn.com/problems/subsets/submissions/...

  • Algorithm | Interval Scheduling

    Interval Scheduling 问题描述:已知n个工作的开始时间和结束时间,求一个工作的子集,使得子集内的...

  • 搜索,动态规划,二叉树的时间复杂度计算通用公式

    搜索的时间复杂度:O(答案总数 * 构造每个答案的时间)举例:Subsets问题,求所有的子集。子集个数一共 2^...

  • 求集合的所有子集

    求集合的所有子集 对于任意集合A,元素个数为n(空集n=0),其所有子集的个数为2^n个 如集合A={a,b,c}...

  • 搜索,动态规划,二叉树的时间复杂度计算通用公式

    搜索的时间复杂度:O(答案总数 * 构造每个答案的时间) 举例:Subsets问题,求所有的子集。子集个数一共 2...

  • 第三讲 递归(5)——练习4.1:集合子集

    练习:集合子集 题目要求 求给定集合的所有子集 分析 代码——我的1 代码——我的2(改进) 改进点:用更简洁的方...

  • Largest Divisible Subset

    题目来源求最大的可整除子集,就是子集中任意一对元素都是倍数关系。我主要利用dp来记录最大值,然后利用pre来记录对...

  • 78. Subsets 子集

    题目 给定一个整数数组,返回所有可能的子集。子集必须是不重复的。 解析 这个问题和上一个问题相似,就是求 cn0 ...

网友评论

      本文标题:Leetcode78、求子集

      本文链接:https://www.haomeiwen.com/subject/jailahtx.html