关于康托展开和逆康托展开详解,及python代码
在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代码相关推荐
- 2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型(三)
目录 前言 一.六种物料挑选 二.周数处理 三.时序预测模型 模型预测结果 建模的部分后续将会写出,想要了解更多的欢迎加博主微信,免费获取更多细化思路+模型! 点关注,防走丢,如有纰漏之处,请留言指教 ...
- 视频教程-深度学习原理详解及Python代码实现-深度学习
深度学习原理详解及Python代码实现 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥88.0 ...
- kmeans算法详解和python代码实现
kmeans算法详解和python代码实现 kmeans算法 无监督学习和监督学习 监督学习: 是通过已知类别的样本分类器的参数,来达到所要求性能的过程 简单来说,就是让计算机去学习我们已经创建好了的 ...
- 编辑距离算法详解和python代码
编辑距离(Levenshtein Distance)算法详解和python代码 最近做NLP用到了编辑距离,网上学习了很多,看到很多博客写的有问题,这里做一个编辑距离的算法介绍,步骤和多种python ...
- 随机森林原理详解及python代码实现
随机森林(RF)算法 1.算法原理 2.对数据的要求(无需规范化) 3.算法的优缺点 4.算法需要注意的点 5.python代码实现(待更......) 导入相关包 读取数据并预处理(必须处理缺失值) ...
- 决策树原理详解及python代码实现
决策树算法(信贷中常用来寻找规则) 1.算法原理 1.1 ID3(多叉树分类) 1.2 C4.5(多叉树分类) 1.3 Cart(二叉树分类+回归) 2.ID3.C4.5与Cart比较 3.算法优缺点 ...
- K-means算法详解及python代码实现
K-means算法 算法步骤 对数据的要求 算法的优缺点 算法需要注意的点 算法实现(python)(待更.......) 算法步骤 1.随机选取K个点作为初始聚类中心 2.计算各个数据到个聚类中心的 ...
- Linux用户、权限及改变文件所有者及文件所属组多例详解 附python代码
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) Linux用户.权 ...
- Dijkstra 路径规划算法原理详解及 Python 代码实现
荷兰数学家 E.W.Dijkstra 于 1959 年提出了 Dijkstra 算法,它是一种适用于 非负权值 网络的 单源最短路径算法,同时也是目前求解最短路径问题的理论上最完备.应用最广的经典算法 ...
- KNN算法原理详解及python代码实现
KNN算法 算法原理 对数据的要求 算法的优缺点 算法需要注意的点 算法实现(python) 算法原理 计算待测样本与train_data的距离d并保存数组中 对d进行排序,取d最近的k个样本 统计样 ...
最新文章
- Codeforces Round #640 (Div. 4)(ABCDEG题解)
- KnockOut绑定
- mySql完全手册2011031401
- ORM系列之Entity FrameWork详解
- 创建数组_如何创建数组
- java代码中出现乱码怎么解决?
- 特斯拉接连出闹剧?一次比一次渗人...
- Python+pandas+matplotlib控制不同曲线的属性
- Android 常用数据操作封装类案例
- MyBatis3整合Spring3、SpringMVC3
- 网络socket编程(c语言)
- html在线上传图片,kindeditor 图片上传
- Python函数语法里的中括号和逗号是什么意思
- html网页随机一言,搭建Hitokoto网站·一言经典语句功能及调用案例
- 在你的应用里使用Jetty嵌入式
- 转:成为Java高级程序员需要掌握哪些?
- 谷歌浏览器播放视频只有声音没有画面解决方法
- uni-app使用Hbuilder X如何安卓APP打包、发布、运行
- 解决 HDFS副本数不足问题
- openEuler couldnt resolve host name