leetcode-第k个排列-康托展开和康托逆展开

全排列剖析:求n个数第k个排序----康托展开 康托展开的公式:(不用记,看形势就行,下面会有例子) X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0 适用范围:没有重复元素的全排列 第一类题:N个数的第k个排序,例子,1,2,3,4共有4!种排列,1234,1243,1324等等。按顺序应该是 1234 1243 1324 1342 1 阅读详情

Leetcode-第60题,分类在回溯算法中,但是回溯并不是最佳解,甚至会超时。
在这里插入图片描述
乍一眼看,这又是一个类似于全排列的回溯题,第一思路是又使用回溯法递归出全排列的所有情况列一个表,然后根据k来找到第k个排列。
很遗憾的是这种方法,百分之百超时,效率太低,即便是添加了一些到达k就返回的剪枝,效率也很难令人满意。

事实上,使用纯数学的方法才是这题的解法,我们只想要第k个排列,不需要无谓的全盘列出。
题目需要第k个排列,那么排列的规律一定是确定的,这就引入了康托展开–Cantor expansion。
这个名字听起来像个高深莫测的数学定理,但是其实就是对全排列与排列顺序关系的数学规则表示:
在这里插入图片描述
这个网上很多讲解:https://blog.youkuaiyun.com/ltrbless/article/details/87696372
比方说{1,2,3}的第3个是213:
”2“前面有个1,那么前面有1*(3-1)!=2种排列;
”1“前面啥都没有,那么前面有0*(3-2)!=0种排列;
”3“前面也啥都没有了,那么前面有0*(3-3)!=0种排列;
所以”213“排在第3位;
那怎么逆推呢?
3-1=2,说明前面有2种情况;
2/(3-1)!,商1余0,说明前面有1个,自己在其后,那么在{1,2,3}挑出2来l;
0/(3-2)!,商0余0,说明前面没有,自己在剩下的第一个,那么在{1,3}中挑出1;
0/(3-3)!,商0余0,说明前面没有,自己在剩下的第一个,那么在{3}中挑出3;
推知k=3时,排列为”213“

直接上代码:

class Solution {
public:
    string getPermutation(int n, int k) {
        int step=0;
        k--;
        int list[10] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};//1-9阶乘的情况直接列表下来
        string res = "";

        int flag[10] = {0};
        while(step!=n)
        {
            int residue = k%(list[n-step-1]);//余数
            int quot = k/(list[n-step-1]);//商
            for(int i=1;i<n+1&&quot>=0;i++)
            {
                if(flag[i]==0)
                {
                    if(quot==0)
                    {
                        flag[i]=1;
                        res.push_back(char(i+48));
                        break;
                    }
                    quot--;
                }
            }
            k = residue;
            step++;
        }
        return res;
    }
};

在这里插入图片描述

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

相关推荐

字节尿性,康托展开求第K个排列!

今天是小浩算法“365刷题计划” 第 109 天。继续为大家讲解 leetcode 第 60 题,是一道中等难度的题目。排列类别的问题主要就两个,一个是全排列:小白真能看一篇文章就学会...

Google大神 345

算法基础知识:康托展开与康托逆展开

康托展开 康托展开是一个全排列到一个自然数的双映射。 通俗简介 康托展开可以求解一个全排列在所有全排列中的次序,比如:(如果规定)排列12345(在1~5的所有全排列中)次序为1 ,(则)12354次序为2,按字典序增加编号递增,依次类推。 康托逆展开可以求解一个次序号对应的全排列是什么。 具体原理就不用术语来解释了,直接上栗子。 栗子 给定一个全排列,计算其字典序。直观起见,我们举例[2, 3, 4, 5,1]来说明康托展开的运算步骤(设其字典序为rank=0): 因为[2, 3, 4, 5,1]的

ZhuhaoNan134的博客 665

算法面试准备 - 手撕系列第五期 - 单头注意力机制(包括Self_atten和Cross_atten)

算法面试准备 - 手撕系列第五期 - 单头注意力机制(包括Self_atten和Cross_atten)

m0_62030579的博客 3608

LeetCode 第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 输出: "21...

hestyle的博客 751

交叉验证选型指南:k折、留一法、时序与分层CV实战决策

交叉验证是评估机器学习模型泛化能力的基础技术,其核心在于通过系统性数据重划分,缓解有限样本对真实分布估计的偏差。原理上,它通过控制训练-验证数据的独立性与代表性,诊断过拟合风险并提升性能指标的稳定性。技术价值体现在避免单次切分导致的结果偶然性、数据利用低效及验证集污染等问题。典型应用场景涵盖分类任务中的类别不平衡处理、时间序列预测的因果约束、用户行为建模中的数据泄露防控等。本文聚焦k折交叉验证、留一法、时间序列交叉验证与分层抽样等主流方法的适用边界与工程落地要点,结合过拟合诊断和泛化能力评估两大热词,提供可

dienangpiao2051的博客 477

告别I2C和SPI:用FPGA驱动DS18B20,一根线搞定温度采集(附Verilog代码)

本文详细介绍了如何利用FPGA通过单总线协议(One-Wire)驱动DS18B20温度传感器,仅用一根数据线实现高效温度采集。内容涵盖协议解析、Verilog代码实现及调试技巧,帮助开发者节省IO资源并提升系统性能。

weixin_42696271的博客 389

LeetCode - Permutations(全排列、康托展开 Cantor expansion)- 题目 31、46、47、60、77

31. Next Permutation 46. Permutations 47. Permutations II 60. Permutation Sequence 77. Combinations 这五道题是LeetCode上关于数列的全排列的题目,为了学习和总结,先记录一下康托展开(Cantor expansion)和逆运算(也有叫康托编码与解码的,但我感觉其实就是全排列 = =)。...

Bob__yuan的博客 607

从零构建MAVLink通信:PX4飞控与QGC的协议握手全解析

本文详细解析了PX4飞控与QGC地面站通过MAVLink协议进行通信的全过程,重点介绍了航点传输协议的状态机设计、INT类型消息的优化优势以及异常处理与调试技巧。通过实战案例和性能优化建议,帮助开发者高效构建无人机通信系统,提升数据传输效率与稳定性。

weixin_29209805的博客 505

leetcode[60]Permutation Sequence 以及 全排列的编码与解码——康托展开 (附完整代码)

leetcode[60]Permutation Sequence 以及 全排列的编码与解码——康托展开 (附完整代码)

Inuchiyo_china的博客 906

瑞萨 RL78 开发环境实战:从 CS+ for CC 到 e² studio 高效开发

本文详细介绍了瑞萨RL78单片机开发环境的选择与配置,对比分析了CS+ for CC和e² studio的特点及适用场景。内容涵盖环境安装、工程创建、调试技巧、外设驱动开发和低功耗设计等实战经验,为开发者提供全面的RL78入门指南,帮助快速上手并高效开发。

4k5l6j7h8的博客 242

聊聊蓝牙配对技术-CTKD OVER BR/EDR

摘要:本文探讨了蓝牙设备通过跨传输密钥派生(CTKD)机制实现双模连接的技术细节。研究发现,手机在连接双模耳机时优先通过BR/EDR配对,再利用CTKD派生BLE连接所需的密钥。关键条件包括:设备地址一致性、启用安全连接(Secure Connection)及禁用justworks配对方式。文章详细剖析了从BR/EDR链路密钥派生BLE长期密钥(LTK)的算法流程,重点解析了H6/H7加密函数的作用机制与安全差异。研究还通过HCI日志验证了密钥交换和加密建立的完整过程,指出蓝牙5.1版本对CTKD安全性的强

十多年蓝牙协议软件开发,擅长蓝牙协议分析 2699

结合力扣题目:第k个排列,学习康托展开和逆康托展开

结合力扣第60题,第k个排列,进行康托展开和逆康托展开的学习。 题目描述:给出集合[1,2,…,n],其所有元素有n!种排列,按大小排列出所有情况,并一一标记,当n=3时,排列如下: “123” “132” “213” “231” “312” “321” 给定n和k,返回第k个排列 如n=3,k=3 则返回"213" 讲述康托编码之前,需要先学习一下康托展开,康托展开是一个全排列到自然数的一个双...

Mr_LHS的博客 400

pi-coding-agent 完整详解

pi-coding-agent是一个由Mario Zechner开发的专业AI编程助手,基于Node.js和TypeScript构建。核心功能包括:1)多级思考模式(ThinkingLevel),从none到ultra控制推理深度;2)对话压缩(compaction)管理长对话记忆;3)WebSocket实时通信支持流式交互。该智能体支持代码生成、调试、重构等专业编程任务,采用AI Agent架构,具备工具调用和多轮记忆能力。项目结构通常包含server、agent、config等模块,可通过二次开发扩展功

大坡3D软件开发 2427

关于康托展开和逆康托展开详解,及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 输出:

weixin_43786241的博客 1152

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

第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 输出:...

ysl_ysl123的博客 217

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LeetCode 60. 排列序列【数学,逆康托展开】困难

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。。

memcpy0的博客 1526

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

leetcode 第60题 排列序列(康拓展开)

题目 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: “123” “132” “213” “231” “312” “321” 给定 n 和 k,返回第 k 个排列。 示例 1: 输入:n = 3, k = 3 输出:“213” 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutation-sequence 思路 这个题思考了半天还是没有理清楚最

lijianqingfeng的专栏 311

leetcode#60 排列序列

leetcode#60 排列序列 题目: 给出两个数n,k,求1~n的第k个全排列(字典序)。 思路:逆康托展开 康托展开 给个排列问是第几个。 先给出结论:康托展开的结果为ans=A[0] * (n-1)!+A[1] * (n-2)!+A[2]*(n-3)!+…。== 其中A[i]代表 位于位置i后面的数小于A[i]值的个数,然后乘上后面的位数的阶乘。 不难理解,设序列p=abcdefg,那么对任意比p小的数列,一定存在前i位与p相同第i位比i小,后i位随意排列。因此,对于任意i,满足的条件数就是后面比i

weixin_48673014的博客 348

LeetCode:60. Permutation Sequence,n全排列的第k个子列

LeetCode:60. Permutation Sequence,n全排列的第k个子列 : 题目: LeetCode:60. Permutation Sequence 描述: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the perm...

dbb191379的博客 226

【LeetCode】13.Permutation Sequence

题目描述(Medium) The set [1,2,3,...,n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order, we get the following sequence for n = 3: "123" "132" "213" "...

YTea的博客 182

康托展开及逆康托展开 + leetcode60. 排列序列

康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。 康托展开: X=an(n−1)!+an−1(n−2)!+...+a1∗0!X = a_n(n-1)! + a_{n-1}(n-2)! +... + a_1*0!X=an​(n−1)!+an−1​(n−2)!+...+a1​∗0! 其中,ai为整数,且0≤ai<i,1≤i≤n其中,a_i为整数,且0 \leq a_i \lt i,1 \leq i \leq.

Dave_lzw的博客 562

力扣排列序列和康托展开与逆康托展开

康托展开是一个全排列到一个自然数的双射常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。

weixin_44901327的博客 257

康托展开和康托逆展开解决第K个排列问题

康托展开和康托逆展开解决第K个排列问题集合{1,2,3,…,n}包含了 n!种不同的排列,将这n!种排列从小到大进行排序,某个排列为第K 个, 求K时,使用康托展开,已知K求对应的排列时,使用康托逆展开。康托展开对于某个排列 a1, a2, a3, .. , an ,将其存入数组s{a1,a2,a3,…,an} 求它在n!个排列中的位置k, 用RLi表示ai后面比ai小的数的个数,Ri表示ai后面

lss_csdn的博客 510

LeetCode 60. 第k个排列(回溯 & 康托展开)

文章目录1. 题目2. 解题2.1 回溯2.2 数学-康托展开 1. 题目 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: “123” “132” “213” “231” “312” “321” 给定 n 和 k,返回第 k 个排列。 说明: 给定 n 的范围是 [1, 9]。 给定 k 的范围是[1,...

Michael是个半路程序员 1280

leetcode 60 第K个排列-康托展开

leetcode 60 第K个排列 1.题目描述 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: “123” “132” “213” “231” “312” “321” 给定 n 和 k,返回第 k 个排列。 说明: 给定 n 的范围是 [1, 9]。 给定 k 的范围是[1, n!]。 示例 1: ...

github_39106037的博客 300
上一篇: 一次送修电脑的感想
下一篇: BeautifulSoup使用指南
alex_mist
博客等级 码龄9年 17粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值