给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号。其中,编号从1开始。
首先来说明一下什么是字典排序,比如说排列序号对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321.
接下来我们具体举一个例子来说明一下这道题的含义,以[4,6,2,7,3,8,1]为例
首先得到第一个待排序的元素,4。在这个排列中有2、3、1这三个元素比它小,确定了第一个元素后对后面的六个元素进行全排列,即6!中情况,找到第二个元素6,比它小的有4,2,3,1这四个元素,但是在6之前的元素已经确定所以将4排除,则共有三个,以此类推。
4 ——》 3*(6!)
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;
}