leetcode-Subsets II-90

输入一组序列,求所有的子集,和这一题一样http://www.cnblogs.com/0summer/p/5824212.html

这是本题输入的序列中可能有重复的元素,没有关系,上一题我已经考虑过这个问题了,就是树的每一层相同的元素只搜索一次,看注释

选择:dfs+回溯

去重:树的每一层相同的元素只搜索一次

树的每一层其实就是一层递归,然后在这层递归中可能选择后面的元素用for循环来实现

 1 class Solution {
 2 public:
 3     void dfs(vector<int> a,int i,vector<vector<int> > &v,vector<int> vv,int k){
 4         if(vv.size()==k){
 5             v.push_back(vv);
 6             return;
 7         }
 8         for(int j=i+1;j<a.size();j++){
 9             if(j!=i+1&&a[j]==a[j-1]) continue;  //去重
10             vv.push_back(a[j]);
11             dfs(a,j,v,vv,k);
12             vv.pop_back();
13         }
14     }
15     vector<vector<int> > subsetsWithDup(vector<int>& nums) {
16         vector<vector<int> >v;
17         vector<int> vv;
18         v.push_back(vv);
19         if(nums.size()==0) return v;
20         sort(nums.begin(),nums.end());
21         for(int k=1;k<=nums.size();k++){
22             for(int i=0;i<nums.size();i++){
23                 if(i!=0&&nums[i]==nums[i-1]) continue;  //去重
24                 vv.push_back(nums[i]);
25                 dfs(nums,i,v,vv,k);
26                 vv.pop_back();
27             }
28         }
29         return v;
30     }
31 };

 

posted @ 2016-08-31 11:56  0_summer  阅读(173)  评论(0编辑  收藏  举报