给出一个可能包含重复数字的排列,求这些数字的所有排列按字典序排序后该排列在其中的编号。编号从1开始。
样例
样例 1:
输入:[1,4,2,2]
输出:3
样例 2:
输入 :[1,6,5,3,1]
输出:24
思路:与排列序号1相比,多了重复数字的可能性,所以我们在 lintcode-197-排列序号 的基础上,使用哈希表保存元素出现的次数,对于重复元素 A[i],A[i] 在 [0,i] 区间中有重复元素,则用 A[i] 的 count * fact 的结果除以重复次数 dup 的阶乘。
class Solution {
public:
/**
* @param A: An array of integers
* @return: A long integer
*/
long long permutationIndexII(vector<int> &A) {
// write your code here
if(A.empty()) return 0;
long long res=1;
long long factor=1;
int len=A.size();
map<int,int> maps;
long long dup=1;
for (int i = len-1; i >=0 ; i--) {
maps[A[i]]++;
if(maps[A[i]]>1)
dup*=maps[A[i]];
int cnt=0;
for (int j = i+1; j < len; j++) {
if(A[j]<A[i]) cnt++;
}
res+=cnt*factor/dup;
factor*=(len-i);
}
return res;
}
};