• Subsets II


    Given a collection of integers that might contain duplicates, S, return all possible subsets.

    Note:

    • Elements in a subset must be in non-descending order.
    • The solution set must not contain duplicate subsets.

    For example,
    If S = [1,2,2], a solution is:

    [
      [2],
      [1],
      [1,2,2],
      [2,2],
      [1,2],
      []
    ]
    

    C++代码实现:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    class Solution
    {
    public:
        vector<vector<int> > subsetsWithDup(vector<int> &S)
        {
            if(S.empty())
                return vector<vector<int>>();
            sort(S.begin(),S.end());
            int n=1<<S.size();
            int i=0;
            vector<vector<int> > ret;
            while(i<n)
            {
                vector<int> temp;
                int index=0;
                int j=i;
                while(j>0)
                {
                    if(j&1)
                        temp.push_back(S[index]);
                    j=j>>1;
                    index++;
                }
                int k;
                for(k=0;k<(int)ret.size();k++)
                {
                    if(ret[k]==temp)
                        break;
                }
                if(k==(int)ret.size())
                    ret.push_back(temp);
                i++;
            }
            return ret;
        }
    };
    
    int main()
    {
        Solution s;
        vector<int> vec= {2,1,2};
        vector<vector<int> > result=s.subsetsWithDup(vec);
        for(auto a:result)
        {
            for(auto v:a)
                cout<<v<<" ";
            cout<<endl;
        }
    }
    方法二:
    class Solution {
    public:
        vector<vector<int> > subsetsWithDup(vector<int> &S) {
            if(S.empty())
                return vector<vector<int> > ();
            sort(S.begin(),S.end());
            vector<vector<int> > res={{}};
            vector<vector<int> > last;
            vector<vector<int> > tmp;
            int i,j;
            int n=S.size();
            int m=res.size();
            for(i=0;i<n;i++)
            {
                if(i>0&&S[i]==S[i-1])
                {
                    m=last.size();
                    tmp=last;
                }
                else
                {
                    m=res.size();
                    tmp=res;
                }
                last.clear();
                for(j=0;j<m;j++)
                {
                    tmp[j].push_back(S[i]);
                    last.push_back(tmp[j]);
                    res.push_back(tmp[j]);
                }
            }
            return res;
        }
    };

    https://leetcode.com/discuss/25834/share-a-clear-solution

  • 相关阅读:
    ansible使用
    git undo last commit
    metadata简介
    tinyint(4),tinyint(80)有什么区别
    php 打印debug日志
    tinycore Network card configuration during exec bootlocal.sh
    Windows使用CMD命令查看进程和终止进程
    @NotEmpty,@NotNull和@NotBlank的区别
    spring boot 程序启动缓慢的问题(二)
    LocalDateTime的一些用法
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4116309.html
Copyright © 2020-2023  润新知