在LeetCode上有这样一道题:
60. 第k个排列
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

“123”
“132”
“213”
“231”
“312”
“321”
给定 n 和 k,返回第 k 个排列。

说明:

给定 n 的范围是 [1, 9]。
给定 k 的范围是[1, n!]。
示例 1:

输入: n = 3, k = 3
输出: “213”
示例 2:

输入: n = 4, k = 9
输出: “2314”


这里可以用逆康托展开来做,先看下什么是康托展开
        定义: 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆的。
        公式如下:
X=A[0]∗(n−1)!+A[1]∗(n−2)!+…+A[n−1]∗0!X = A[0] * (n-1)! + A[1] * (n-2)! + … + A[n-1] * 0!X=A[0]∗(n−1)!+A[1]∗(n−2)!+…+A[n−1]∗0!
其中A[i]A[i]A[i]表示当前数值比后面数值大的个数,举个例子:
1、2、3

排列 康托展开 名次
123 0* 2!+0* 1!+0* 0!=0 1
132 0* 2!+1* 1!+0* 0!=1 2

python代码实现:

from math import factorial
def kangtuo(nums):# nums: intlistnums = str(nums)lens = len(listnums)out = 0for i in range(lens):res = 0jiechen = factorial((lens-i-1))for j in range(i+1, lens):if listnums[j]< listnums[i]:res += 1out += res*jiechenreturn out+1

逆康托展开
        以542136为例:542136为559位,即n为6位,k为559
        k = k-1 = 558
        nums = [1,2,3,4,5,6]

  • 558 /(6-1)!=558 / 120=4…78,则第一位数值后面有4位比他小的数,固为5=nums[4],去掉5,nums=[1,2,3,4,6]
  • (558-4*120=78)/(5-1)!=3…6,则第二位数值后面有3位比他小的数,固为4=nums[3],去掉4,nums=[1,2,3,6]
  • (78-72)/(4-1)!=1,则第三位数值后面有1位比他小的数,固为2=nums[1],去掉2,nums= [1,3,6]
  • 6-6=0,则第四位数值后面有0位比他小的数,固为nums[0],nums=[3,6]
  • 类似后面的数都为nums[0]

下面就是采用逆康托实现的60. 第k个排列解法:

class Solution(object):def getPermutation(self, n, k):""":type n: int:type k: int:rtype: str"""def jiechen(m):res = [1]for i in range(1, m+1):res.append(int(res[-1])*i)return res[-1]nums = []for i in range(1,n+1):nums.append(i)k = k-1out = []while nums:p = k//jiechen(len(nums)-1)out.append(nums[p])k = k-p*jiechen(len(nums)-1)nums.pop(p)return ''.join(map(str,out))

关于康托展开和逆康托展开详解,及python代码相关推荐

  1. 2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型(三)

    目录 前言 一.六种物料挑选 二.周数处理 三.时序预测模型 模型预测结果 建模的部分后续将会写出,想要了解更多的欢迎加博主微信,免费获取更多细化思路+模型! 点关注,防走丢,如有纰漏之处,请留言指教 ...

  2. 视频教程-深度学习原理详解及Python代码实现-深度学习

    深度学习原理详解及Python代码实现 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥88.0 ...

  3. kmeans算法详解和python代码实现

    kmeans算法详解和python代码实现 kmeans算法 无监督学习和监督学习 监督学习: 是通过已知类别的样本分类器的参数,来达到所要求性能的过程 简单来说,就是让计算机去学习我们已经创建好了的 ...

  4. 编辑距离算法详解和python代码

    编辑距离(Levenshtein Distance)算法详解和python代码 最近做NLP用到了编辑距离,网上学习了很多,看到很多博客写的有问题,这里做一个编辑距离的算法介绍,步骤和多种python ...

  5. 随机森林原理详解及python代码实现

    随机森林(RF)算法 1.算法原理 2.对数据的要求(无需规范化) 3.算法的优缺点 4.算法需要注意的点 5.python代码实现(待更......) 导入相关包 读取数据并预处理(必须处理缺失值) ...

  6. 决策树原理详解及python代码实现

    决策树算法(信贷中常用来寻找规则) 1.算法原理 1.1 ID3(多叉树分类) 1.2 C4.5(多叉树分类) 1.3 Cart(二叉树分类+回归) 2.ID3.C4.5与Cart比较 3.算法优缺点 ...

  7. K-means算法详解及python代码实现

    K-means算法 算法步骤 对数据的要求 算法的优缺点 算法需要注意的点 算法实现(python)(待更.......) 算法步骤 1.随机选取K个点作为初始聚类中心 2.计算各个数据到个聚类中心的 ...

  8. Linux用户、权限及改变文件所有者及文件所属组多例详解 附python代码

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) Linux用户.权 ...

  9. Dijkstra 路径规划算法原理详解及 Python 代码实现

    荷兰数学家 E.W.Dijkstra 于 1959 年提出了 Dijkstra 算法,它是一种适用于 非负权值 网络的 单源最短路径算法,同时也是目前求解最短路径问题的理论上最完备.应用最广的经典算法 ...

  10. KNN算法原理详解及python代码实现

    KNN算法 算法原理 对数据的要求 算法的优缺点 算法需要注意的点 算法实现(python) 算法原理 计算待测样本与train_data的距离d并保存数组中 对d进行排序,取d最近的k个样本 统计样 ...

最新文章

  1. Codeforces Round #640 (Div. 4)(ABCDEG题解)
  2. KnockOut绑定
  3. mySql完全手册2011031401
  4. ORM系列之Entity FrameWork详解
  5. 创建数组_如何创建数组
  6. java代码中出现乱码怎么解决?
  7. 特斯拉接连出闹剧?一次比一次渗人...
  8. Python+pandas+matplotlib控制不同曲线的属性
  9. Android 常用数据操作封装类案例
  10. MyBatis3整合Spring3、SpringMVC3
  11. 网络socket编程(c语言)
  12. html在线上传图片,kindeditor 图片上传
  13. Python函数语法里的中括号和逗号是什么意思
  14. html网页随机一言,搭建Hitokoto网站·一言经典语句功能及调用案例
  15. 在你的应用里使用Jetty嵌入式
  16. 转:成为Java高级程序员需要掌握哪些?
  17. 谷歌浏览器播放视频只有声音没有画面解决方法
  18. uni-app使用Hbuilder X如何安卓APP打包、发布、运行
  19. 解决 HDFS副本数不足问题
  20. openEuler couldnt resolve host name

热门文章

  1. 英特尔® 驱动程序和支持助理 (intel-driver-support-assistant) 安装后无法扫描电脑硬件驱动解决
  2. 网页短信平台开发为什么要用短信服务程序
  3. 2021中石油程序设计平台新生热身赛9-挨打记录2021/11/23
  4. CentOS7最小化安装搭建KMS服务器
  5. AI大潮下的软件工程发展趋势
  6. KubeSphere3.0发布满足对容器混合云的所有想象
  7. 服务器里搭建游戏玩家访问卡是什么原因
  8. uiautomation实现自动化
  9. 2018第二届中国移动金融发展大会
  10. laravel导出Excel表格提示内存超出