[LintCode 197] 排列序号(Python)

来源:互联网 发布:热血屠龙进阶数据 编辑:程序博客网 时间:2024/06/04 18:22

题目描述

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

样例
例如,排列 [1,2,4] 是第 1 个排列。

思路

例如排序[1, 4, 2]。
1的后面有 2! 种排列;4的后面有 1! 种排列;2的后面有 0! 种排列。
1的后面有0个数比它小;4的后面有1个数比它小;2的后面有0个数比它小。
index=2!0+1!1+0!0
因为是从0开始计数的,最后index还需加1。

代码

class Solution:    """    @param: A: An array of integers    @return: A long integer    """    def permutationIndex(self, A):        # write your code here        index = 0        if A is None or len(A) == 0:            return index        # 记录当前位之后的排列可能数        t1 = [0] * len(A)        # 记录之后的数中比当前数小(逆序)的个数        t2 = [0] * len(A)        t = 1        for i in range(len(A)):            if i != 0:                t *= i                t1[len(A) - 1 - i] = t            if i == len(A) - 1:                break            for j in range(i+1, len(A)):                if A[j] < A[i]:                    t2[i] += 1        res = 0        for i in range(len(t1)):            res += t1[i] * t2[i]        return res + 1

复杂度分析

时间复杂度O(n2),空间复杂度O(n)

原创粉丝点击