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 };