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

原文地址:https://www.cnblogs.com/shine-yr/p/5214848.html