zoukankan      html  css  js  c++  java
  • [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;
        }
    };
  • 相关阅读:
    Java IO: InputStreamReader和OutputStreamWriter
    Java IO: 序列化与ObjectInputStream、ObjectOutputStream
    Java IO: Buffered和Data
    [Codeforces Round #613 (Div. 2)]
    [算进] 巴士
    [算进] 小木棍
    [算进] 数据备份
    [算进] 双端队列 题解
    [算进] 蚯蚓 题解
    [算进] 赶牛入圈 题解
  • 原文地址:https://www.cnblogs.com/x1957/p/3517989.html
Copyright © 2011-2022 走看看