排列序号

给出一个不含重复数字的排列,求这些数字的全部排列按字典序排序后该排列的编号。其中,编号从1开始。排序

首先来讲明一下什么是字典排序,好比说排列序号对于数字一、二、3......n的排列,不一样排列的前后关系是从左到右逐个比较对应的数字的前后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的全部的排列中最前面的是12345,最后面的是 54321.io

接下来咱们具体举一个例子来讲明一下这道题的含义,以[4,6,2,7,3,8,1]为例字典

首先获得第一个待排序的元素,4。在这个排列中有二、三、1这三个元素比它小,肯定了第一个元素后对后面的六个元素进行全排列,即6!中状况,找到第二个元素6,比它小的有4,2,3,1这四个元素,可是在6以前的元素已经肯定因此将4排除,则共有三个,以此类推。数字

4 ——》 3*(6!)return

6 ——》3*(5!)

2 ——》1*(4!)

7 ——》2*(3!)

3 ——》1*(2!)

8 ——》0*(1!)

1 ——》0*(0!)

代码以下:

long long permutationIndex(vector<int> &A) (从后往前算)

{
       if(A.empty())
       {
           return 0;
       }
       if(A.size() == 1)
       {
           return 1;
       }
       long long sum = 0;
       long long face = 1;
       for(int i = A.size()-1;i>=0;i--)
       {
           int rank = 0;
           for(int j = i+1;j<A.size();j++)
           {
               if(A[i] > A[j])
               {
                   rank++;//计算后面比A[I]小的元素有几个
               }
           }
           sum = sum + rank*face;
           face = face*(A.size()-i);
       }
       return sum+1;

}

相关文章
相关标签/搜索