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 ...
随机推荐
- IIS 程序池优化配置方案
内容目录 IIS 程序池优化配置方案IIS高并发配置一.IIS站点绑定程序池设置二.支持万级并发请求 IIS 程序池优化配置方案 最近由于系统的客户越来越多,有客户反映访问速度变慢,尤其是api的请求 ...
- [CF 1238F] The Maximum Subtree 树DP
题意 给定一颗树,求这个树的最大子树,且这个子树是一个good-tree. good-tree的定义是:每个节点可以表示成一个数值区间,而树上的边表示两个点表示的数值区间相交. 题解 通过分析可以发现 ...
- Kendo UI for jQuery使用教程:使用MVVM初始化(一)
[Kendo UI for jQuery最新试用版下载] Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support ...
- Spring使用@AspectJ开发AOP(零配置文件)
前言: AOP并不是Spring框架特有的.Spring只是支持AOP编程 (面向切面编程) 的框架之一. 概念: 1.切面(Aspect) 一系列Advice + Pointcut 的集合. 2.通 ...
- python算数、逻辑运算,位运算
算术运算符 对变量和数组进行算术运算. 算术运算符:+,-,*,/,% +:将连个或者多个数值相加 -:将两个数值相减 *:将两个数值相乘 /:将两个数值相除 %:取相除的余数 赋值运算符 将右边的值 ...
- 线程异步更新UI
winform程序一般是不允许非主线程操作ui,单可以通过线程与委托的方式并结合Control类提供的BeginInvoke机制进行ui更改 如下,这是更新ui的方法 private void upU ...
- Django 文件配置、pycharm及django连接数据库、表的增删改查 总结
静态文件配置 1.你在浏览器中输入网址能够有响应的资源返回给你 是因为后端已经提前给你开设该资源的接口,也就意味着你所能 访问到的资源 都是人家事先定义好的 2.django如何给用户开设资源接口呢? ...
- Win10升级后VMWare内的系统连不了网如何解决
一些既想要体验新系统又不愿放弃旧系统的用户,一般都会在电脑中安装VMWare虚拟机.不过,他们偶尔也会遇到这样一个问题,当win10系统自动升级后,VMWare虚拟机内的系统就会出现无法连接网络的情况 ...
- Spring Boot教程(二十八)通过JdbcTemplate编写数据访问
数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. 首先,为了连接数据库需要引入jdbc支持,在pom.xml中引入如下配置: <depende ...
- 设置centos7界面语言为中文
1.在终端中输入命令 vim ~/.bashrc 来编辑“.bashrc”文件 2.在最后添加“ export LANG="zh_CN.UTF-8" ” 3.执行 sudo sh ...