zoukankan      html  css  js  c++  java
  • LeetCode(78) Subsets

    题目

    Given a set of distinct integers, nums, return all possible subsets.

    Note:
    Elements in a subset must be in non-descending order.
    The solution set must not contain duplicate subsets.
    For example,
    If nums = [1,2,3], a solution is:

    [
          [3],
          [1],
          [2],
          [1,2,3],
          [1,3],
          [2,3],
          [1,2],
          []
    ]

    分析

    求给定一个集合的子集!

    该题目与LeetCode 77 Combinations类似,都是动态规划思想的应用!

    同理,不能采用暴力法解决问题,因为会带来很高的复杂度。

    仔细分析,我们发现包含n个元素的集合的子集有以下三个部分组成:

    1. 第一部分,该集合前n-1个元素组成的集合的子集;
    2. 第二部分,该集合中最后一个元素构成的一个子集合;
    3. 第三部分,对该集合前n-1个元素组成的集合的子集,每一个都添加最后一个元素;

    注意,对于返回的集合的全部子集包括一个空子集!

    AC代码

    class Solution {
    public:
        vector<vector<int>> subsets(vector<int>& nums) {
            if (nums.empty())
                return vector<vector<int>>();
    
            sort(nums.begin(), nums.end());
    
            vector<vector<int>> ret =  getSubsets(nums);
            //不要丢掉最后的空子集
            ret.push_back(vector<int>());
    
            return ret;
        }
    
        vector<vector<int>> getSubsets(vector<int>& nums) {
            if (nums.empty())
                return vector<vector<int>>();
            int len = nums.size();
            //初始化一个包含空元素的结果vector
            vector<vector<int> > ret;
    
            //用0~len-1个原数组元素,建立一个新数组
            vector<int> tem_nums(nums.begin(), nums.begin() + len - 1);
            vector<vector<int>> tmp = getSubsets(tem_nums);
            int t_size = tmp.size();
    
            //第一部分,0~len-1所有元素的真子集
            for (int i = 0; i < t_size; i++)
            {
                ret.push_back(tmp[i]);
            }//for
    
            //第二部分,加入第len个元素
            ret.push_back(vector<int>(1, nums[len - 1]));
    
            //第三部分,0~len-1所有元素的真子集,加入第len个元素
            for (int i = 0; i < t_size; i++)
            {
                tmp[i].push_back(nums[len - 1]);
                ret.push_back(tmp[i]);
            }//for
    
            return ret;
        }
    };
    

    GitHub测试程序源码

  • 相关阅读:
    jquery--blur()事件,在页面加载时自动获取焦点
    jquery三级联动
    工具集
    兼容各个浏览器:禁止鼠标选择文字事件
    jquery 事件委托(利用冒泡)
    小功能1:多种方法实现网页加载进度条
    JavaSE| 泛型
    SSM整合
    Redis数据库 02事务| 持久化| 主从复制| 集群
    Hadoop| MapperReduce02 框架原理
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214848.html
Copyright © 2011-2022 走看看