和上一個差不多,但是有重復.
有重復元素就挺麻煩的.
比如
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; } };