第k个字典序全排列

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... 阅读详情

转自:

http://blog.youkuaiyun.com/scarecrow398966925/article/details/25543587


给定一个数字n和k,表示求一个由n个数字组成的序列的第k个字典序排列。比如给定n=3,k = 2则求由数字【1,2,3】组成的所有序列中的安字典序排列的第k个。不难看出这三个数字组成的序列的按字典序排序如下:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
所以得到的第k=2个序列就是1,3,2。

分析:
  1. 可以用上一篇文章所说的NextPermutation方法在初始序列为【1,2,3,···n】的基础上调用k-1次nextPermutation方法即可。
  2. 可以利用康托编码来实现。
康托编码:

    对于一个集合{1,2,3,4,...,n}的从小到大排序(或者从大到小,与从小到大类似,这里只说前者)的全排列显然它有n!项用自然数1,2,...,n!与之一一对应,这是一种对应法则,康托编码就是这么一种可以实现按字典序排序的序列与自然数之间相互对应的双射。

编码规则为:

对于{1,2,3,...,n}生成的已经从小到大排序好的全排列
x=a[n]*(n-1)!+a[n-1]*(n-2)!+...a[1]*0!
a[m]代表比在第m位的数字小并且没有在第m位之前出现过的数字的个数(以个位数为第1位)
x代表比这个数小的数的个数,所以这个数的顺序就是x+1


例1 {1,2,3,4,5}的全排列,并且已经从小到大排序完毕,找出45231在这个排列中的顺序

比4小的数有3个
比5小的数有4个,但4已经在之前出现过了所以是3个
比2小的数有1个
比3小的数有两个,但2已经在之前出现过了所以是1个
比1小的数有0个
那么45231在这个排列中的顺序是3*4!+3*3!+1*2!+1*1!+0*0!+1=94


例2 {1,2,3,4,5,6}的全排列,并且已经从小到大排序完毕,找出423615在这个排序中的顺序
比4小的数有3个
比2小的数有1个
比3小的数有2个,但2已经在之前出现过了所以是1个
比6小的数有5个,但4,2,3已经在之前出现过了所以是2个
比1小的数有0个
比5小的数有4个,但1,2,3,4已经在之前出现过了所以是0个
那么423615在这个排序中的顺序是3*5!+1*4!+1*3!+2*2!+0*1!+0*0!+1=395


解码规则为:

解码规则是编码规则的逆运算,即在知道某个序列的排列序数(y)的时候,求这个序列。先对y-1,得到x,然后分别求序列的每个位置的数。举例说明

例1 {1,2,3,4,5}的全排列,并且已经从小到大排序完毕
(1)找出第96个数
首先用96-1得到95
用95去除4! 得到3余23
用23去除3! 得到3余5
用5去除2!得到2余1
用1去除1!得到1余0
有3个数比它小的数是4,所以第一位是4
有3个数比它小的数是4,但4已经在之前出现过了所以是5(因为4在之前出现过了所以实际比5小的数是3个)
有2个数比它小的数是3
有1个数比它小的数是2
最后一个数只能是1
所以这个数是45321


(2)找出第16个数
首先用16-1得到15
用15去除4!得到0余15
用15去除3!得到2余3
用3去除2!得到1余1
用1去除1!得到1余0
有0个数比它小的数是1
有2个数比它小的数是3, 但由于1已经在之前出现过了所以是4(因为1在之前出现过了所以实际比4小的数是2)
有1个数比它小的数是2 ,但由于1已经在之前出现过了所以是3(因为1在之前出现过了所以实际比3小的数是1)
有1个数比它小得数是2 ,但由于1,3,4已经在之前出现过了所以是5(因为1,3,4在之前出现过了所以实际比5小的数是1)
最后一个数只能是2
所以这个数是14352


通过上面的例子应该足够对康托编码进行解码了,对于本题来说,就是一个解码过程,程序如下::


int factorial(int n){
    int res = 1;
    for(int i = 1;i<=n;i++)
       res *= i;
    return res;
}
 
vector<int> KthPermutation2(int n,int k){
    vector<int> vec;
    vector<int> res;
    for(int i = 0;i<n;i++)
       vec.push_back(i+1);
    int base = factorial(n-1);
    k--;
    for(int i = 0;i<n-1;i++){
       int divieRes = k/base;
       k = k%base;
       auto num = next(vec.begin(),divieRes);
       res.push_back(*num);
       vec.erase(num);
       base /= (n-i-1);
    }
    res.push_back(vec[0]);
    return res;
}



Java实现 蓝桥杯VIP 算法提高 连接乘积 算法提高 连接乘积 时间限制:1.0s 内存限制:256.0MB 问题描述   192这个数很厉害,用它分别乘以1、2、3,会得到:   192 x 1 = 192   192 x 2 = 384   192 x 3 = 576   把这三个乘积连起来,得到192384576,正好是一个1~9的全排列   我们把上面的运算定义为连接乘积:   m x (1 … n) = k(其中m > ... 阅读详情

相关推荐

C/C++_五大常规算法_分治算法

分治法 一个装有 16 枚硬币的袋子,16 枚硬币中有一个是伪造的,伪造的硬币和普通硬币从表面上看不出有任何差别,但是那 个伪造的硬币比真的硬币要轻。现有给你一台天平,请你在尽可能最短的时间内找出那枚伪造的硬币。 常规思维: 每次从待比较的硬币中取两枚进行计较,如果天平平衡(相等)就继续取剩下的硬币进行比较 继续以上过程,直到找到硬币。 强者思维: 我们先将 16 枚硬币分为左右两个部分,各为 8 个硬币,分别称重,必然会有一半轻一半重,而我们要的就是轻的那组,重 的舍去。接下来我们继续对轻的进行五五分

weifc-wei 的博客 2725

手把手教你用socat为内网服务创建SSL/TLS加密隧道(自签名证书实战)

本文详细介绍了如何使用socat工具为内网服务创建SSL/TLS加密隧道,通过自签名证书实战步骤,确保网络数据传输的安全性。从环境准备、证书生成到socat配置和客户端接入,提供全面的操作指南,适用于家庭实验室和企业测试环境的安全加固需求。

weixin_30781433的博客 417

手把手教你用CsvView分析大疆无人机飞行日志(附实战CTF题解)

本文详细介绍了如何使用CsvView工具分析大疆无人机飞行日志,包括环境搭建、日志提取、核心功能解析及CTF实战技巧。通过实战案例,帮助读者掌握无人机取证的关键技术,提升日志分析能力,特别适合网络安全竞赛和实际取证场景。

weixin_42652674的博客 456

第k个字典序全排列(kth permutation)

给定一个数字n和k,表示求一个由n个数字组成的序列的第k个字典序排列。比如给定n=3,k = 2则求由数字【1,2,3】组成的所有序列中的安字典序排列的第k个。不难看出这三个数字组成的序列的按字典序排序如下: 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 所以得到的第k=2个序列就是1,3,2。 分析: 可以用上一篇文章所说的NextPe

稻草人的专栏 4946

Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的理论简述和python仿真实现(附源码)

经典论文Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的学习与编程仿真,提供源码

m0_59701926的博客 1238

构建高可用CephFS NFS网关:NFS-Ganesha与RADOS集群的深度整合

本文详细介绍了如何构建高可用的CephFS NFS网关,通过NFS-Ganesha与RADOS集群的深度整合,实现高效文件共享。文章涵盖核心架构、部署实战、性能调优及避坑指南,帮助用户解决Ceph客户端兼容性问题,提升存储访问效率。特别强调高可用设计,确保服务稳定性,适用于金融、电商等高要求场景。

weixin_26976635的博客 254

算法很美:全排列&按字典序第k个全排列

全排列 题目描述 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 代码 public static void main(String[] args) { int[] a= {1,2,3,4,5}; ArrayList<ArrayList<Integer>> solve = solve(a); System.out.prin

Zc9741的博客 384

tewa-707e光猫超级密码获取方法

这款光猫很魔性,没有WIFI,没有USB接口,没有Telnet,试了很多方法去获取超级密码都不行。解密时可能会报错,可能是文件后面部分不晓得是咋拼接过来的,用AES解密时分组数据有问题。3、这个文件是用AES加密了的,直接打开是乱码,所以得用AES解密,key为16个字节的 x00。打开解出来的文件,然后搜索 telecomadmin,就可以发现超级密码了。参考资料里面的光猫不是同一款,但解密的方法基本相同的。

shaowl111的专栏 1万+

逆康托展开

简单介绍下: 这个方法还是用例子来说比较好例1 {1,2,3,4,5}的全排列,并且已经从小到大排序完毕(1)找出第96个数首先用96-1得到95用95去除4! 得到3余23用23去除3! 得到3余5用5去除2!得到2余1用1去除1!得到1余0 有3个数比它小的数是4所以第一位是4有3个数比它小的数是4但4已经在之前出现过了所以是5(因为4在之前出现过了所以实际比5小的数是3个)有2个数比它小的...

peizhiinfo 323

YOLO11实战:手把手教你优化钢材表面缺陷识别模型(基于NEU-DET数据集)

本文详细介绍了如何使用YOLO11优化钢材表面缺陷识别模型,基于NEU-DET数据集进行实战训练。从数据增强、模型架构优化到训练过程控制,全面解析提升钢材缺陷检测性能的关键技术,特别针对裂纹、划痕等典型缺陷提出针对性解决方案。

weixin_29081163的博客 379

通信算法之283:大疆DJI云哨系统-DJI DroneID物理层协议-解速率匹配及Turbo译码

3. 完整云哨接收机,接收灵敏度。交流: 1279682290 ,2. Turbo译码模块。1. 解速率匹配模块。

leegang12的专栏 868

算法 {第K全排列的字典序}

1

qq_66485519的博客 158

YOLOv11 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性

本文介绍了分离与增强注意力模块(SEAM)在YOLOv11中的结合应用。SEAM模块旨在增强面部特征学习能力,特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域,第一部分使用深度可分离卷积减少参数并学习通道重要性,通过1x1卷积增强通道联系,利用两层全连接网络融合通道信息,经指数归一化后作为注意力权重与原始特征相乘。我们将SEAM集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,该方法有助于提升模型检测性能。

魔改工程师的博客 1665

最大子数组、输入总结、第K大的数、字典序全排列

最大子数组 arr没有正数:就是数组中的最大元素 arr中有正数:从左到右遍历arr,变量cur记录每一步的累加和,遇到正数增加,遇到负数,将cur减少; 当cur<0,说明此部分不能作为子数组的左边部分,令cur = 0,从下一个重新开始; 当cur>0,用额外变量记录值max,即用max全程跟踪cur出现的最大值即可 public static int maxSu...

liuzewei2015的博客 727

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

输出n的全排列的字典序编号为k的全排列

n个元素{1,2,•••,n}有n!个不同的排列。将这n!个排列按字典序排列。并编号为0,1,2.....,n!-1。每 个排列的编号为其字典序的值。例如。当n=3时,其字典排序为:123,132,213,232,312,321,这六个数的字典序值分别为 0,1,2,3,4,5,现给定任意n,输出字典序为k的排列(0<=k<=n!-1)。 这题 也是来源于今年的美团面试题.. ...

weixin_30520015的博客 238

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

第k个字典序全排列(kth permutation)- 康托排列

给定一个数字n和k,表示求一个由n个数字组成的序列的第k个字典序排列。比如给定n=3,k = 2则求由数字【1,2,3】组成的所有序列中的安字典序排列的第k个。不难看出这三个数字组成的序列的按字典序排序如下: 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 所以得到的第k=2个序列就是1,3,2。 分析: 可以用上一篇文章所说的NextPe

mandagod的博客 1825

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

算法 {字典序}

1

qq_66485519的博客 127

解决Leetcode第3470题全排列IV

这个问题关键是要先把1至n共n个数的全排列找出来,然后根据“任意相邻两个元素不都为奇数或都为偶数”的规则生成交替排列,并按字典序排好序,剩下的输出第k个排列就好办了。给你两个整数n和k,一个交替排列是前n个正整数的排列,且任意相邻两个元素不都为奇数或都为偶数。生成的交替排列中的第3个排列为:[2, 1, 4, 3]生成的交替排列中的第2个排列为:[3, 2, 1]生成的交替排列中没有第3个排列,故输出[]由于k=6,我们返回[3,4,1,2]。[3,4,1,2]←第6个排列。[3,2,1]←第2个排列。

2302_79682652的博客 556

第k个排列问题(自用)

说白了这个算法,就是通过先分组,然后定位的数学方法来解决问题。还是以n=3,k=3为例,确定第1位时,后面2位还有(3-1)!=2种排列,所以k=3不在这个组里,1后面跟的两个,2后面跟的两个,k=3应该在以2开头的组里,并且应该是这个组里的第一个;现在确定了第一个数字,第二位的第一个肯定是最小的那个,那第三位只能是剩下那个了。把这个分组的逻辑转换成编程语言就可以了,利用循环来做即可。

jiajiachonga的博客 1094

第k个排列

给定n和k,求n的全排列中字典序第k个排列. 样例 样例 1: 输入: n = 3, k = 4 输出: "231" 解释: n = 3时, 全排列如下: "123", "132", "213", "231", "312", "321" 样例 2: 输入: n = 1, k = 1 输出: "1" 挑战 O(n*k)很容易, 你可以做到O(n^2n​2​​)或更低的时...

weixin_41791402的博客 168

permutation 1(HDU-6628)

Problem Description A sequence of length n is called a permutation if and only if it's composed of the first n positive integers and each number appears exactly once. Here we define the "difference...

Alex_McAvoy的博客 458

|洛谷|数学|P1088 火星人

http://www.luogu.org/problem/show?pid=1088 求字典序第k大全排列,可以用C++的next_permutation函数 #include #include #include #include #define ms(i,j) memset(i,j, sizeof i); using namespace std; int a[10005]; int main

博客停更,请到"再见,优快云"文章中找新博客地址 398

permutation 1 【HDU 6628】【暴力全排列】

题目链接 题目大意 我们定义1到n的全排列的“差排列”为n-1个数:p2-p1 , p3-p2 , … … … pn - pn-1 让你求出n的全排列的差排列字典序的第k大。 解题思路 因为k不大于10000所以可以采用爆搜的解法,当n不大于8的时候直接爆搜出它的全排列,如果n大于8的话,那么前面的数是固定n, 1, 2,… …所以只用求出后面的八位的全排列即可。 两个搜索其实可以并到一个dfs...

qq_41925919的博客 237

全排列问题及其follow-up

http://www.cnblogs.com/wangxiaobao/p/5947633.html 全排列问题是经典的算法题目。实现可以使用库函数(如STL next_permutation), 也可以递归回溯法。 同时其follow up又包括: 当排列中有重复元素时如何处理;next permutaion的实现原理;查找第K个排列等。 本文就这些问题进行讨论。 注

zdy0_2004的专栏 1024
上一篇: 序列的最长递增、递减序列
下一篇: STL函数之lower_bound upper_bound
DOLEAM
博客等级 码龄11年 9粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值