[leetcode]Subsets II


和上一個差不多,但是有重復.

有重復元素就挺麻煩的.

比如

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM