和上一个差不多,但是有重复.
有重复元素就挺麻烦的.
比如
1 1 1
我每个1都是可以选或者不选
那么第一个和第三个选了,第二个不选和第一个第二个选了第三个不选是一样的效果...
可以按上一题的做法做,然后再去重...
那我们怎么搞呢?
想想我们的递归树
再每一层不选重复元素,到下一层才选,那就去重了,不是么?
因为这样选是唯一的啊
ex.
0 1 2
1 1 1
我选了0位置的1,那在root的时候就不能选1 ,2 位置的
那继续,选了1位置的1,再递归可以选2位置的也可以不选,如果不选就是11
那我在1位置的时候不选1位置的1的话,也不能选2位置的,所以11是唯一的.
class Solution { public: void dfs(vector<vector<int> >& ans , vector<int>&s , vector<int>&tmp , int start) { ans.push_back(tmp); for(int i = start ; i < s.size() ; ++i) { if(i != start && s[i] == s[i-1]) continue; //select only once in every layer tmp.push_back(s[i]); //select dfs(ans , s , tmp , i + 1); //do recusive tmp.pop_back(); //delete } } vector<vector<int> > subsetsWithDup(vector<int> &S) { vector<vector<int> > ans; if(S.size() <= 0) return ans; vector<int> tmp; sort(S.begin() , S.end()); // sort dfs(ans , S , tmp , 0); return ans; } };
by 1957