60. Permutation Sequence

https://leetcode.com/problems/permutation-sequence/description/
给一个n,k,求1~n的全排列所有结果中第k个序列。
思路1:先求全排列(参考46. Permutations,用回溯法求),然后在所有结果中找第k个。这样会超时。

思路2:由于全排列按字典序,因此可以通过方法把所求序列计算出来。
例如求1~9的全排列的第360000个序列,从最高位开始,9!= 362880 = 8!* 9,因此360000 // 8! = 8,可知另8个数全排列的话,360000可以将第9个数排完8种情况,而且数字不能重复取,这个数只有可能是9,将9取出,放在最高位。剩下的情况有360000 % 8 = 37439种,进入下一轮迭代。

37439 // 7! = 7,说明1~8可以取完7个数字的全排列,只有可能最高位是8,37439 % 7! = 2159,进入下一轮。

2159 // 6! = 2,说明1~7可以取两种,剩下的数中可以保证取两种的最小数是3.
以此类推。

class Solution:
    def getPermutation(self, n, k):
        num = []
        for i in range(1, n+1):
            num.append(i)
        fact = [0]*n
        fact[0] = 1
        for i in range(1, n):
            fact[i] = i * fact[i-1]
        k -= 1
        record = []
        for i in range(n, 0, -1):
            ind = k // fact[i-1]
            k = k % fact[i-1]
            record.append(num[ind])
            num.remove(num[ind])  #移出
        res = ''
        for i in record:
            res += str(i)
        return res

猜你喜欢

转载自blog.csdn.net/u012033124/article/details/80727915