1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[leetcode]Subsets II

Posted on 2014-01-13 20:11  1957  阅读(3356)  评论(1编辑  收藏  举报

和上一个差不多,但是有重复.

有重复元素就挺麻烦的.

比如

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