给出一个可能包含重复数字的排列,求这些数字的所有排列按字典序排序后该排列在其中的编号。编号从1开始。
样例:
给出排列[1, 4, 2, 2],其编号为3。
#ifndef C198_H
#define C198_H
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
class Solution {
public:
/**
* @param A an integer array
* @return a long integer
*/
long long permutationIndexII(vector<int>& A) {
// Write your code here
int len = A.size();
if (len <= 0)
return 0;
vector<int> v = A;
map<int, int> dup;
long long count=1;
long long dupnum = 1;
for (int k = len-1; k >=0; --k)
{
if (dup.find(A[k])!=dup.end())
{
dup[A[k]]++;
dupnum *= dup[A[k]];
}
else
{
dup[A[k]] = 1;
}
int num = 0;
for (int j = k+ 1; j < A.size(); j++)
{
if (A[j] < A[k])
{
num++;
}
}
count += num * Recur(len - k -1)/dupnum;
}
return count;
}
long long Recur(int a)
{
if (a == 0)
return 1;
return a*Recur(a - 1);
}
};
#endif