4.排列序号

 题目:给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号。其中,编号从1开始。

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;
    }
};

posted @ 2017-08-06 16:59  Starry*sky  阅读(138)  评论(0编辑  收藏  举报