描述
给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号。其中,编号从1开始。
您在真实的面试中是否遇到过这个题?
是
样例
例如,排列 [1,2,4]
是第 1
个排列。
class Solution {
public:
/**
* @param A: An array of integers
* @return: A long integer
*/
long long permutationIndex(vector<int> &A) {
// write your code here
int len = A.size();
int c[len];
c[len - 1] = 0;
vector<int> a;
a.push_back(A[len - 1]);
for(int i = len - 2;i >= 0; --i){
auto iter = lower_bound(a.begin(), a.end(), A[i]);
c[i] = iter - a.begin();
a.insert(iter, A[i]);
}
long long ans = 1, fac = 1, cc = 1;
for(int i = len - 2;i >= 0; --i)
ans += (fac*=cc++) * c[i];
return ans;
}
};
注意:其中一些迭代器的用法:
lower_bound:详见 https://www.cnblogs.com/is-Tina/p/7294067.html
insert:详见 https://blog.csdn.net/duan19920101/article/details/51557854