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 ...
随机推荐
- vue-cli 4 安装与 新建项目 路由
环境: windows: vue-cli: 编辑器: vsCode npm: #去nodejs网安装https://npm.taobao.org/mirrors/node/v12.12.0/node- ...
- PAT Basic 1005 继续(3n+1)猜想 (25 分)
卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n=3 进行验证的时 ...
- redis3.2 源码安装
wget http://download.redis.io/releases/redis-3.2.3.tar.gz tar -zxvf redis-.tar.gz cd redis make & ...
- jdk1.8环境变量配置
JAVA_HOME=/usr/java/jdk1.8.0_45PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOM ...
- js 动态加载js 并执行
function loadJS(url, success) { var domScript = document.createElement('script'); domScript.src = ur ...
- (转)window.parent和window.opener区别
下面一段代码是关于window.parent和window.opener区别 来讲的,我们如果要用到iframe的值传到另一框架就要用到window.opener.document.getElemen ...
- 51 Nod 1161 Partial sums
1161 Partial Sums 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 取消关注 给出一个数组A,经过一次 ...
- TensorFlow使用记录 (三): Learning Rate Scheduling
file: tensorflow/python/training/learning_rate_decay.py 参考:tensorflow中常用学习率更新策略 神经网络中通过超参数 learning ...
- LOJ #6358 前夕 (组合计数、容斥原理)
题目链接 https://loj.ac/problem/6358 (另外一道\(4\)的倍数题左转loj #6356) 题意 题面写得就像一坨X一样,我来复述一下吧. 有\(N\)个元素构成的集合,要 ...
- ...扩展运算符+rest参数+call/apply/bind
之前在set,map里面有提过扩展运算符的概念,但是今天偶然遇到一个问题,类似于扩展运算符的经典用法,突然发现对其了解不是很深,所以再来整理一下扩展运算符的相关知识. 重点:扩展运算符内部调用的是数据 ...