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测试程序源码

  • 相关阅读:
    linux 基础笔记(一)
    wysiwyg加ckeditor加 代码高亮
    将html转换为Drupal模板文件的一般步骤
    最重要的7个Drupal内核模板文件
    drupal模板命名规则
    mysql存储过程和事件
    阿里云图片压缩上传代码
    BeanUtils No value specified for Date的解决方法
    mysql SQLyog导入导出csv文件
    mysql去除重复查询的SQL语句基本思路
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214848.html
Copyright © 2011-2022 走看看