全排列 字典序全排列

Posted lqerio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全排列 字典序全排列相关的知识,希望对你有一定的参考价值。

全排列递归的方法参考 leetcode 47

字典序算法:升序

参考https://www.jianshu.com/p/58ae30cf6bca

技术图片

 

 技术图片

 

 

实现:

技术图片

 

 

判断了是否相等

计算全排列的数量方法为 n!/ (m!*p!*...)   m,p为重复的数字的重复量

参考 https://blog.csdn.net/sinat_36215255/article/details/78197129

#include<iostream>  
#include<algorithm>  
#include<vector>
using namespace std;  
vector<int>nums;

void Permutation(int len,vector<int>nums)  
    {  
        int j, k;  
        int flag=1;  //start 0s
        while (true)  
        {   
        for(int i=0;i<len;i++){
                if(nums[i]==0&&flag)
                        continue;
                else{
                        flag=0;        
                        printf("%d",nums[i]);
                }
        }
        printf(" ");
        flag=1;
      
        for (j = len - 2; j >= 0 && nums[j] >= nums[j + 1]; j--);//注意此处 j >= 0 判断条件在前,加个等号即可  
      
        if (j < 0) return;//结束  
      
        for (k = len - 1; k > j&&nums[k] <= nums[j]; k--);//加个等号即可  
      
        swap(nums[k], nums[j]);  
      
        for (int l = j + 1, r = len - 1; l < r; l++, r--)  
                swap(nums[l], nums[r]);  
        }  
    }

int calc(int len){
        int summ=1;
        
        for(int i=1;i<=len;i++)
                summ*=i;
        return summ;
}
int main()  
    {  
        
        int n;
        while(cin>>n)
        nums.push_back(n);
        sort(nums.begin(),nums.end());
        int len=nums.size();

        //all 0
        int flag=0;
        for(int i=0;i<len;i++)
                if(nums[i]!=0){
                        flag==1;
                        break;
                }
        if(flag)
        {
                cout<<"1 0"<<endl;
                return 0;
        }

        vector<int>dup;
        int cnt=1;
        int bef=nums[0];
        for(int i=1;i<len;i++)
                if(bef==nums[i]){
                        cnt++;
                        continue;
                }
                else
                {
                        dup.push_back(cnt);
                        cnt=1;
                        bef=nums[i];
                }
        
        //dup.push_back(cnt);   
        vector<int>::iterator iter=dup.begin();
        int divide=1;
        for(iter;iter!=dup.end();iter++)
                divide*=calc(*iter);
        int summ=calc(len)/divide;
        printf("%d ",summ);

        Permutation(len,nums);  
        system("pause");
        return 0;  
    }

以上是关于全排列 字典序全排列的主要内容,如果未能解决你的问题,请参考以下文章

java实现-字典序全排列

分治法实现1-N的数字按字典序全排列组合 Java语言

排列的字典序问题(Java)

LeetCode_Next Permutation

字典排序permutation

全排列 未按字典序