zoukankan      html  css  js  c++  java
  • LeetCode-Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations.

    For example,
    [1,1,2] have the following unique permutations:
    [1,1,2], [1,2,1], and [2,1,1].

    第一个版本,加了一个set去除重复

    class Solution {
    public:
        void sub(vector<vector<int> > & ret,vector<int>& num,int index){
            if(index==num.size()){
                ret.push_back(num);
                return ;
            }
            int temp;
            sub(ret,num,index+1);
            for(int i=index+1;i<num.size();i++){
                if(num[i]!=num[index]){
                    temp=num[i];
                    num[i]=num[index];
                    num[index]=temp;
                    sub(ret,num,index+1);
                    temp=num[i];
                    num[i]=num[index];
                    num[index]=temp;
                }
            }
        }
        vector<vector<int> > permuteUnique(vector<int> &num) {
            // Note: The Solution object is instantiated only once and is reused by each test case.
            vector<vector<int> >ret;
            sub(ret,num,0);
            set<vector<int> > sec(ret.begin(),ret.end());
            vector<vector<int> >ret2(sec.begin(),sec.end());
            return ret2;
        }
    };
    View Code

    第二个版本,改变策略直接填入

    class Solution {
    public:
        void sub(vector<vector<int> > &ret,vector<int>& num,vector<int>&num2,vector<int>&count,vector<int>& count2,int index){
            if(index==num.size()){
                ret.push_back(num);
                return ;
            }
            for(int i=0;i<num2.size();i++){
                if(count2[i]<count[i]){
                    num[index]=num2[i];
                    count2[i]++;
                    sub(ret,num,num2,count,count2,index+1);
                    count2[i]--;
                }
            }
        }
        vector<vector<int> > permuteUnique(vector<int> &num) {
            // Note: The Solution object is instantiated only once and is reused by each test case.
            vector<int>num2;
            vector<int>count;
            sort(num.begin(),num.end());
            if(num.size()==0)return vector<vector<int> >();
            num2.push_back(num[0]);
            count.push_back(1);
            for(int i=1;i<num.size();i++){
                if(num[i]!=num[i-1]){
                    num2.push_back(num[i]);
                    count.push_back(1);
                }
                else{
                    count[count.size()-1]++;
                }
            }
            vector<int>count2;
            count2.resize(count.size(),0);
            vector<vector<int> >ret;
            sub(ret,num,num2,count,count2,0);
            return ret;
        }
    };
    View Code
  • 相关阅读:
    [原创]Java在线编辑word文档调用PageOffice实现并发控制
    [原创]Java动态填充word文档并上传到服务器
    mysql数据类型
    mysql 数据增删改查基本语句
    MYSQL中char 与 varchar 的区别
    MYSQL 同时执行多条SQL语句
    关于MyEclipse10编辑JSP卡顿现象
    鼠标悬停放大图片效果
    简单实现 飘浮 广告层特效
    简单实现 特效(董侨JonneyDong)
  • 原文地址:https://www.cnblogs.com/superzrx/p/3352666.html
Copyright © 2011-2022 走看看