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