60第K个排列
题目:给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
给定 n 和 k,返回第 k 个排列。
说明:给定 n 的范围是 [1, 9]。给定 k 的范围是[1, n!]。
来源: https://leetcode-cn.com/problems/permutation-sequence/
法一:自己的代码 耗时很短,利用python自带的阶乘函数计算耗时会更短
思路:转化为一个纯数学的问题,关键是要把每种情况都考虑到,特别是除n!后是整数的情况,举例的时候就要把每种情况都枚举到,编程才不会出错
import math
class Solution:
def getPermutation(self, n: int, k: int):
# 自定义阶乘函数
def n_factorial(x):
if x == 0:
return 1
else:
return x * n_factorial(x-1)
nums = [i+1 for i in range(n)]
result = ''
while n > 0:
n = n - 1
# 通过观察数据可以看出,假如输入是(4,9),则说明以1开头的有3!个,以2开头的有3!个,
# 所以用9除以3的阶乘是1.5,1,5向上取整为2,即nums中的第二个数2是结果中的第一个数,
# 再用9减去6为3表示从2开始的组别中找第三个数,
res = k / n_factorial(n)
res_up = math.ceil(res)
# 注意这里向下取整必须是向上取整后减1,这是因为比如输入的是(4,6),则6除3!为1,1-1=0,所以不可直接向下取整
res_down = res_up - 1
k = k - res_down * n_factorial(n)
result = result + str(nums[res_up-1])
del nums[res_up-1]
print('-'* 20)
print('k', k)
# print(res)
print(res_up)
# print(res_down)
return result
if __name__ == "__main__":
duixiang = Solution()
a = duixiang.getPermutation(4,9)
print(a)
法二:自己的代码 利用回溯,但是超时,超时是因为没有用continue,每个分支都要检查一遍
class Solution:
def getPermutation(self, n: int, k: int):
nums = [i+1 for i in range(n)]
global count,result
count = 0
def backtrack(a='', nums=nums, ):
global count,result
# print('k',count)
if count == k:
return
if len(a) == n:
count += 1
# print('count', count)
if count == k:
result = a
# exit()
# return count
for i,j in enumerate(nums):
r = nums.copy()
del r[i]
# print('ttt',count)
# sign,result = backtrack(a+str(j), r)
backtrack(a+str(j), r)
backtrack()
return result
改进后的不会超时,注意这里return的用法,非常巧妙
class Solution:
def getPermutation(self, n: int, k: int):
nums = [i+1 for i in range(n)]
from1to9_factorial = [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
def backtrack(a='', nums=nums,k = k ):
# 一旦满足条件立即逐层返回a,结束所有函数
if len(a) == n:
return a
t = from1to9_factorial[len(nums) - 1]
for i,j in enumerate(nums):
if k > t:
# 执行剪枝操作,如果大于t了,就结束本次循环
k = k - t
continue
# r中是下次for循环要遍历的数
r = nums.copy()
del r[i]
# 这里必须用return,避免了定义全局变量来解决问题
return backtrack(a+str(j), r, k)
return backtrack()
if __name__ == "__main__":
duixiang = Solution()
a = duixiang.getPermutation(4,10)
print(a)
60第K个排列的更多相关文章
- Java实现 LeetCode 60 第k个排列
60. 第k个排列 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" &q ...
- LeetCode 60 第K个排列
题目: 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "13 ...
- LeetCode 60. 第k个排列(Permutation Sequence)
题目描述 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "1 ...
- 力扣60——第k个排列
原题 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: 1. "123" 2. &qu ...
- 算法:60.第k个排列
解答参考:https://blog.csdn.net/lqcsp/article/details/23322951 题目链接:https://leetcode-cn.com/problems/perm ...
- 代码题(45)— 下一个排列、第k个排列
1.31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只 ...
- LeetCode:第K个排列【60】
LeetCode:第K个排列[60] 题目描述 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: &quo ...
- LeetCode(60): 第k个排列
Medium! 题目描述: 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" ...
- LeetCode 中级 - 第k个排列(60)
可以用数学的方法来解, 因为数字都是从1开始的连续自然数, 排列出现的次序可以推 算出来, 对于n=4, k=15 找到k=15排列的过程: 1 + 对2,3,4的全排列 (3!个) 2 + 对1,3 ...
随机推荐
- C语言字符串操作小结
1)字符串操作strcpy(p, p1) 复制字符串strncpy(p, p1, n) 复制指定长度字符串strcat(p, p1) 附加字符串strncat(p, p1, n) 附加指定长度字符串s ...
- openstack Rocky系列之keystone:(一)keystone的启动
keystone在httpd的入口执行文件为/usr/bin/keystone-wsgi-public 查看文件/usr/bin/keystone-wsgi-public,根据代码,看到主要是这几行代 ...
- 谈谈我所理解的HashMap和HashTable
HashMap和HashTable之间的联系和区别如下: 1.HashMap几乎可以等价于Hashtable,但是它们之间继承不同:HashMap extends AbstractMap implem ...
- 牛客练习赛47 E DongDong数颜色 (树上启发式合并)
链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- postgresql 锁表查询语句
1 查找锁表的pid select pid from pg_locks l join pg_class t on l.relation = t.oid where t.relkind = 'r' an ...
- POJ1059Glass Beads
Once upon a time there was a famous actress. As you may expect, she played mostly Antique Comedies m ...
- 使用Vue自定义组件时,报did you register the component correctly? For recursive components, make sure to provide the "name" option.(未注册组件)的原因之一
错误信息: [Vue warn]: Unknown custom element: <list> - did you register the component correctly? F ...
- 绑定与非绑定方法及反射,isinstance和issubclass内置函数
目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射(面 ...
- es6的Map结构
es6的Map结构主要解决Object的键名只能是单一属性的问题.它可以是字符串,对象,数组,等等 其中有个问题要注意一下,就是 var map = new Map(); map.set(['a'], ...
- Unity3D_(游戏)2D坦克大战 像素版
2D坦克大战 像素版 游戏规则: 玩家通过上.下.左.右移动坦克,空格键发射子弹 敌人AI出身时朝向己方大本营(未防止游戏快速结束,心脏上方三个单位障碍物设为刚体) 当玩家被击杀次数>=3 ...