zoukankan      html  css  js  c++  java
  • leetcode 46-Permutations and 47-Permutations II

    Permutations

    Given a collection of numbers, return all possible permutations.

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





    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].



    全排列问题

    第二个题目基于第一题。第二题给的数组中还有可能相等的元素。

    请參照 全 排 列


    题一代码

    class Solution {
    public:
        vector<vector<int>> permute(vector<int>& nums) {
           vector<vector<int>>v;
           v.clear();
           vector<int>a;
           next_c(v,nums.size(),a,nums,0);
           return v;
        }
        void next_c(vector<vector<int>>&v,int n,vector<int>& a,vector<int>& b,int cur) /// b[]中的数能够同样
        {
            if(cur==n){
                v.push_back(a);
            }
            else{
                for(int i=0;i<n;i++)
                     if(!i||b[i]!=b[i-1])///
                     {
                        int c1=0,c2=0;
                        for(int j=0;j<cur;j++) if(a[j]==b[i]) c1++;
                        for(int j=0;j<n;j++) if(b[j]==b[i]) c2++;
                        if(c1<c2){
                            a.push_back(b[i]);// 不能用a[cur]=b[i];
                            next_c(v,n,a,b,cur+1);
                            a.pop_back();
                          }
                     }
            }
        }
    };



    题二代码。当然能够过题一。

    class Solution {
    public:
        vector<vector<int>>v;
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            v.clear();
           vector<int>a;a.clear();
           sort(nums.begin(),nums.end());
           next_c(nums.size(),a,nums,0);
           return v;
        }
        void next_c(int n,vector<int>& a,vector<int>& b,int cur) /// b[]中的数能够同样
    {
        if(cur==n){
            v.push_back(a);
        }
        else{
            for(int i=0;i<n;i++)
            if(!i||b[i]!=b[i-1])///
                {
                int c1=0,c2=0;
                for(int j=0;j<cur;j++) if(a[j]==b[i]) c1++;
                for(int j=0;j<n;j++) if(b[j]==b[i]) c2++;
                if(c1<c2){
                    a.push_back(b[i]); //a[cur]=b[i];
                    next_c(n,a,b,cur+1);
                    a.pop_back();
                }
            }
        }
    }
    };


  • 相关阅读:
    全文本搜索神器
    唯一索引和普通索引怎么选择
    程序员应不应该搞全栈
    c 的陷阱
    抽象能力
    电影电视剧推荐
    系统故障诊断
    一次web网站被入侵的处理记录
    Spark RDD 操作
    (转)Mysql哪些字段适合建立索引
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6816860.html
Copyright © 2011-2022 走看看