码迷,mamicode.com
首页 > 其他好文 > 详细

【Subsets】cpp

时间:2015-05-20 13:02:57      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:

题目:

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],
  []
]

代码:

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
            const int len = nums.size();
            std::sort(nums.begin(), nums.end());
            vector<vector<int> > ret = Solution::subsubsets(nums, 0, len-1);
            vector<int> none;
            ret.push_back(none);
            return ret;
    }
    static vector<vector<int> > subsubsets(vector<int>& nums, int begin, int end)
    {
            vector<vector<int> > ret;
            if ( begin>end ) return ret;
            for ( int i = begin; i <=end; ++i )
            {
                // puts the curr value in
                vector<int> curr;
                curr.push_back(nums[i]);
                ret.push_back(curr);
                // get the subset
                vector<vector<int> > subset = Solution::subsubsets(nums, i+1, end);
                for ( int j = 0; j < subset.size(); ++j )
                {
                    //ret.push_back(subset[j]);
                    subset[j].insert(subset[j].begin(), nums[i]);
                    ret.push_back(subset[j]);
                }
            }
            return ret;
    }
};

tips:

每层递归的任务是活的传入数组的全部子集

1. 留出第i个元素

2. 把i+1到end的元素送到下一层递归

3. 递归终止条件是begin>end

返回下一集全部子集后,算上第i个元素后的全部集合如下:

1)第i个元素单独算一个

2)第i个元素 + 子集中每个元素

这样递归到第0个元素,就得到了全部的非空子集;再根据题目要求补上空集。

============================================

完成之后觉得好像哪里不对。{1,2,3} 如果留下了1传入{2,3}时,这个过程中已经获得了{2,3}全部子集。

修改后的代码如下:

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
            const int len = nums.size();
            std::sort(nums.begin(), nums.end());
            vector<vector<int> > ret = Solution::subsubsets(nums, 0, len-1);
            vector<int> none;
            ret.push_back(none);
            return ret;
    }
    static vector<vector<int> > subsubsets(vector<int>& nums, int begin, int end)
    {
            vector<vector<int> > ret;
            if ( begin>end ) return ret;
            // puts the curr value in
            vector<int> curr;
            curr.push_back(nums[begin]);
            ret.push_back(curr);
            // get the subset
            vector<vector<int> > subset = Solution::subsubsets(nums, begin+1, end);
            for ( int j = 0; j < subset.size(); ++j )
            {
                ret.push_back(subset[j]);
                subset[j].insert(subset[j].begin(), nums[begin]);
                ret.push_back(subset[j]);
            }
            return ret;
    }
};

tips:

这个版本整理了逻辑误区。

【Subsets】cpp

标签:

原文地址:http://www.cnblogs.com/xbf9xbf/p/4516802.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!