78. Subsets

https://leetcode.com/problems/subsets/

本题大意:给出一个整数集合(集合元素具有相异性),求出所有的子集合。

例如:如果给定集合为[1,2,3],那么答案应为:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]
解题思路:手动模拟该过程,结果应该包含:含有0个元素的集合(空集),含有1个元素的集合,含有2个元素的集合……含有n个元素的集合(全集)。
对于含有k个元素的集合应该怎么找呢?第一次从集合的第一个元素开始找,同时k-1,第二次从剩下的第一个元素开始找,同时k-1……一直到k为0,说明这样的集合找到了。
递归的奥妙就在于,第一轮中:换掉的只是最后一个元素,保持前面的元素不变,换换换一直换到原集合的最后一个元素。这么换完了一轮以后,这时候换掉的可不止一个元素了,应该是换完倒数第二个元素以后,再进行新的一轮换最后一个元素。
这么进行递归就会得到所有的情况。
建议手动模拟整个递归调用的过程。
代码如下:
 1 class Solution {
 2 public:
 3     vector<vector<int> > subsets(vector<int>& nums) {
 4         vector<int> tmp;
 5         vector<vector<int> >result;
 6         sort(nums.begin(),nums.end());
 7         for(int i = 0; i <= nums.size(); i++)
 8         {
 9             subsetsHelper(result, tmp, nums, i, 0);
10         }
11         return result;
12     }
13     void subsetsHelper(vector<vector<int> >& result, vector<int>& tmp, vector<int>& nums, int k, int start)
14     {
15         if(k == 0)
16         {
17             result.push_back(tmp);
18             return;
19         }
20         for(int i = start; i < nums.size(); i++)
21         {
22             tmp.push_back(nums[i]);
23             subsetsHelper(result, tmp, nums, k-1, i+1);
24             tmp.pop_back();
25         }
26     }
27 };

 

posted @ 2016-06-14 16:15  可爱的熊乖乖  阅读(874)  评论(0编辑  收藏  举报