蠡口60. Permutation Sequence

我觉得这是道数论题,因为一般人能想到的就是像Permutations那道题一样,用DFS遍历得到所有permutations,
然后返回第k个permutations,时间复杂度为T(n)=O(1)+nT(n-1), 这里深度拷贝的平均时间复杂度为 O(1),
递归每次排除掉一个,故每次递归的时间复杂度为T(n-1)。
T(n)=O(1)+n
T(n-1)
=> T(n)=O(Σ(n!/k!)) (k=1到n)
=> T(n)<O(n!*Σ(1/k!)) (k=0到无穷)
=> T(n)=O(n!)。但是这样是会超时的!
于是根据九章算法的提示,完全按照康拓展开wiki上的算法,先将k-=1,然后再循环地做除法和取余,不断更新k,
并从还未用到的数里面取出相应的数字加入到最后的结果里。注意循环的次数应为n,
因为最后返回的permutation string的长度是n,而每次循环都会得到相应的数字。提交runtime超过95.59%,memory超过100%。

class Solution(object):
    def getPermutation(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: str
        """
        nums=range(1,n+1)
        Fac=[1]
        for i in range(1,n): Fac.append(Fac[-1]*i)
        ans,k="",k-1
        for i in range(n):
            m=k/Fac[n-1-i]
            k=k%Fac[n-i-1]
            ans+=str(nums[m])
            nums.pop(m)
        return(ans)

猜你喜欢

转载自www.cnblogs.com/Leisgo/p/11696186.html