首页 > 其他 > 详细

LeetCode Subsets (DFS)

时间:2015-11-18 22:56:36      阅读:362      评论:0      收藏:0      [点我收藏+]

 

 

题意:

  给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复)。

 

 

思路:

  DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计。

技术分享
 1 class Solution {
 2 public:
 3     vector<vector<int>> subsets(vector<int>& nums) {
 4         sort(nums.begin(),nums.end());
 5         DFS(0,nums,tmp);
 6         return ans;        
 7     }
 8 
 9     void DFS(int pos,vector<int>& nums,vector<int>& seq)
10     {
11         ans.push_back(seq);
12         for( ; pos<nums.size(); pos++)    
13         {
14             seq.push_back(nums[pos]);
15             DFS(pos+1,nums,seq);    //
16             seq.pop_back();
17         }
18     }
19 private:
20     vector<vector<int>> ans;
21     vector<int> tmp;
22 };
AC代码

 

  迭代解决:由于集合中的元素是不可能出现相同的,所以子集的个数必定是2n个,即每个数字有可取可不取这两种选择。

技术分享
 1 class Solution {
 2 public:
 3     vector<vector<int>> subsets(vector<int>& nums) {
 4         sort(nums.begin(),nums.end());
 5         int n=nums.size();
 6         for(int i=0; i<(1<<n); i++)
 7         {
 8             vector<int> tmp;
 9             for(int j=0; j<n; j++)
10             {
11                 if((i>>j)&1)
12                     tmp.push_back(nums[j]);
13             }
14             ans.push_back(tmp);
15         }
16         return ans;        
17     }
18 private:
19     vector<vector<int>> ans;
20 };
AC代码

 

 

  如果集合中有相同的元素的话,解法同LEETCODE COMBINATION SUM II (DFS),主要在于去重,而去重的技术一样。

技术分享
 1 class Solution {
 2 public:
 3     vector<vector<int>> subsets(vector<int>& nums) {
 4         sort(nums.begin(),nums.end());
 5         DFS(0,nums,tmp);
 6         ans.push_back(vector<int>());
 7         return ans;        
 8     }
 9 
10     void DFS(int pos,vector<int>& nums,vector<int>& seq)
11     {
12         if(pos>=nums.size())
13         {
14             if(!seq.empty())    ans.push_back(seq);
15             return ;
16         }
17         for( ; pos<nums.size(); pos++)    
18         {
19             seq.push_back(nums[pos]);
20             DFS(pos+1,nums,seq);    //
21             seq.pop_back();
22 
23             while(pos+1<nums.size() && nums[pos]==nums[pos+1])    pos++;//主要在这
24         }
25         DFS(pos+1,nums,seq);
26     }
27 private:
28     vector<vector<int>> ans;
29     vector<int> tmp;
30 };
AC代码

 

LeetCode Subsets (DFS)

原文:http://www.cnblogs.com/xcw0754/p/4975981.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!