給出一個不含重複數字的排列,求這些數字的全部排列按字典序排序後該排列的編號。其中,編號從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;
}