leetcode: 60. Permutation Sequence
2017-11-18 16:47
267 查看
Problem
# The set [1,2,3,…,n] contains a total of n! unique permutations. # # By listing and labeling all of the permutations in order, # We get the following sequence (ie, for n = 3): # # "123" # "132" # "213" # "231" # "312" # "321" # Given n and k, return the kth permutation sequence. # # Note: Given n will be between 1 and 9 inclusive.
Idea
先通过举例来获得更好的理解。以n = 4,k = 9为例: 1234 1243 1324 1342 1423 1432 2134 2143 2314 <= k = 9 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321 最高位可以取{1, 2, 3, 4},而每个数重复3! = 6次。所以第k=9个permutation的s[0]为{1, 2, 3, 4}中的第9/6+1 = 2个数字s[0] = 2。 而对于以2开头的6个数字而言,k = 9是其中的第k' = 9%(3!) = 3个。而剩下的数字{1, 3, 4}的重复周期为2! = 2次。所以s[1]为{1, 3, 4}中的第k'/(2!)+1 = 2个,即s[1] = 3。 对于以23开头的2个数字而言,k = 9是其中的第k'' = k'%(2!) = 1个。剩下的数字{1, 4}的重复周期为1! = 1次。所以s[2] = 1. 对于以231开头的一个数字而言,k = 9是其中的第k''' = k''/(1!)+1 = 1个。s[3] = 4
AC
class Solution(): def getPermutation(self, n, k): import math seq, k, fact, perm = "", k - 1, math.factorial(n - 1), list(range(1, n + 1)) for i in reversed(range(n)): curr = perm[k // fact] seq += str(curr) perm.remove(curr) if i > 0: k %= fact fact //= i return seq if __name__ == "__main__": assert Solution().getPermutation(3, 2) == '132'
相关文章推荐
- LeetCode 60. Permutation Sequence
- [LeetCode]60. Permutation Sequence
- leetcode 60. Permutation Sequence
- **LeetCode 60. Permutation Sequence
- leetcode60. Permutation Sequence
- LEETCODE60. Permutation Sequence
- [LeetCode]60. Permutation Sequence
- [Leetcode] 60. Permutation Sequence
- Leetcode 60. Permutation Sequence
- 【LeetCode】60. Permutation Sequence
- leetcode 60. Permutation Sequence
- leetcode 60. Permutation Sequence
- LeetCode-60. Permutation Sequence
- [LeetCode]problem 60. Permutation Sequence
- LeetCode 60. Permutation Sequence 全排列的第k个
- leetcode 60. Permutation Sequence
- LeetCode 60. Permutation Sequence(N排列,第K序列)
- 【LeetCode】60. Permutation Sequence
- Leetcode 60. Permutation Sequence
- Leetcode-60. Permutation Sequence