思路:
对原数组中的每一个位置,找到其后有多少个数比它小,
然后再相加这些数与为对应的权的乘积.
代码:
class Solution {
public:
/**
* @param A an integer array
* @return a long integer
*/
long long permutationIndex(vector<int>& A) {
// Write your code here
// 找出A中每一个位置其后有多少个数比它小
// 然后再相加这些数与位对应的权
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;
}
};
代码仿其所写,觉颇有精妙之处,多谢,不过被页面闪瞎了,哈.
本文介绍了一种计算数组中每个元素后面有多少个小于它的元素的方法,并通过累加这些计数与其权重的乘积来确定排列索引。使用了C++实现了一个具体的算法示例。
1937

被折叠的 条评论
为什么被折叠?



