LeetCode 第k个排列 c++ 回溯

2024最新华为OD机试试题库全 -【第k个排列】- C卷 给定参数n,从1到n会有n1,2,3,…,n,这n个数字共有n!种排列。按大小顺序升序列出所有排列的情况,并一一标记,当n=3给定n和k,返回第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”

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

这是一道乍一看和 LeetCode“全排列”那道题一样的,只是找出所有排列,然后输出第K个就行
用相似的思路,visited记录某数是否已经出现过,然后递归的每次加入一个数
但是超时
即使改成到第K个就结束全部递归,仍然超时
所以参考了题解的剪枝方法
图片来自精选题解:

是这样,在递归回溯产生的各个分支是这样的:

在这里插入图片描述
一开始深度为0,进行了第一步探索时深度为1,我们可以知道当前分支产生的叶子节点的数目为(总数-1)!个,也就是4-1=3!=6,而k=9>6,所以必然不在这个分支里,可以直接跳过这个分支 – 因为递归到最后再回溯到深度为1的层,并不care这其中到底经过了哪些叶子节点,只是经过了3!=6个叶子节点后继续递归罢了,所以k = k-6 = 3
然后下一步探索走2开头的排列 叶子节点有6个,此时k=3是包含其中的
阿么继续向下,在21开头,深度为2的分支里,接下来可以选3、4,最终的叶子节点是2!=2个<k=3,所以跳过,
直接到该层下一个选项,也就23开头
依次进行,直到k==1的时候,包含的那个排列就是第K个排列

代码

class Solution {
public:
	vector<vector<int>>nums;
	vector<int>jiecheng;
	void calcnums()
	{
		jiecheng.push_back(1);
		jiecheng.push_back(1);
		jiecheng.push_back(2);
		for (int i = 3; i <= 9; i++)
		{
			int top = jiecheng[i - 1];
			jiecheng.push_back(top * i);
		}
		//for (int i = 0; i < jiecheng.size(); i++)
			//printf("%d ", jiecheng[i]);
	}
	void backtrack(vector<int>cur, int n, int k,int depth, vector<bool>visited) {
		if (depth == n)
		{
			nums.push_back(cur);
			return;
		}
		int num_branch = jiecheng[n - depth - 1];
		for (int i = 1; i <= n; i++)
		{
			if (visited[i])
				continue;
			if (num_branch < k)
			{
				k -= num_branch;
				continue;
			}
			
			visited[i] = true;
			cur.push_back(i);
			backtrack(cur, n, k, depth + 1, visited);
		}
	}
	string getPermutation(int n, int k) {
		calcnums();
		vector<bool>visited;
		vector<int>cur;
		for (int i = 1; i <= n+1; i++)
			visited.push_back(false);
		backtrack(cur, n, k, 0, visited);

		string ans = "";
		vector<int>last = nums[0];
		for (int i = 0; i < last.size(); i++)
			ans += (last[i] + '0');
		return ans;
	}
};
手把手用ROS实现Ego-Planner动态避障:无人机撞树问题终结方案 本文详细介绍了如何在ROS和Gazebo仿真环境中,通过配置和调优Ego-Planner算法,实现无人机的动态避障功能。文章深入解析了其基于局部梯度优化的核心思想,提供了从环境搭建、参数详解到代码集成的完整实践指南,并分享了实战排错经验,旨在彻底解决无人机在复杂动态场景中的碰撞问题。 阅读详情

相关推荐

2.1 量子精密测量:SERF原子陀螺仪中的核自旋-电子自旋强耦合机制

本文深入解析了SERF原子陀螺仪中核自旋-电子自旋强耦合机制的核心原理与应用。通过量子精密测量技术,SERF陀螺仪实现了超高精度的惯性导航,其独特的磁场自补偿和拉莫尔进动特性使其在弱磁场环境下表现出色。文章还探讨了关键技术突破和前沿进展,展示了量子精密测量在惯性导航领域的巨大潜力。

kotlin6android的博客 210

数据结构与算法之美笔记——基础篇(下):贪心算法、分治算法、回溯算法

数据结构与算法之美笔记——基础篇(下):贪心算法、分治算法、回溯算法

页页的博客 698

基于WEB的报价管理系统的设计与实现

该系统采用B/S模式,后台运用SpringMVC和MyBatis搭建,利用MySQL数据库,来组织存储和管理数据,使用tomcat服务器向外提供服务。使用该系统对外有利于提高企业的综合竞争力,对内有利于提高成本管理和控制的水平,简化了报价流程、提高了工作效率、精简了报价机构,降低了成本。研究和掌握必要的信息采集和数据查询技术,是各个企业,事业单位信息化的一个重要标志。当前大多数企业采取的报价方式仍然是用EXCEL表格和人工的方式,这不仅不利于大量数据的总结,更不利于对销售利润的控制。

m0_60918862的博客 999

629. K个逆序对数组

即dp[i][j]=dp[i][j-1]+dp[i-1][j]-dp[i-1][j-i]根据上面可知,dp[5][3]=dp[4][3]+dp[4][2]+dp[4][1]+dp[4][0]我们可以推出dp[5][4]=dp[4][4]+…dp[4][0]=dp[5][3]+dp[4][4]即dp[i][j]=dp[i][j-1]+dp[i-1][j]即dp[5][8]=dp[4][8]+dp[5][7]-dp[4][3]即dp[i][j]=dp[i-1][j]+…......

xiaolu567的博客 475

【实战分享】低成本K型热电偶测温方案:单运放放大与STM32 ADC采集优化

本文详细介绍了低成本K型热电偶测温方案,通过单运放放大与STM32 ADC采集优化,解决了信号微弱、负电压处理和冷端补偿等核心挑战。方案采用LMV358运放和T型网络降低噪声,结合STM32的ADC校准和软件滤波,实现±0.5℃精度,物料成本控制在15元以内,适用于工业测温场景。

weixin_30839881的博客 165

【Creator】cocoscreator 2.4 apk还原为工程 (1)

Cocos Creator 2.4 还原图片 meta文件

jokesuser的博客 2258

Leetcode 面试题51. 数组中的逆序对【回溯法&BIT】

文章目录问题描述解题报告归并排序方法BIT【参考官方答案】实现代码归并排序实现BIT实现参考资料 问题描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 解题报告 归并排序方法 不解释。 时间复杂度:O(nlogn)O(nlog n)O(nlogn) 空间复杂度:O(n)O(n)O(n) BIT【参考官方答案】 【树状...

MD 342

WhatsApp协议算法

我想其实有很多人还不太了WhatsApp群控,简单来说,它和我们常使用的微信聊天软件是类似的,只不过它是基于通讯录的,操作起来比较简单便捷,所以现在有很多国家都喜欢用WhatsApp。一般情况下,筛号不会造成账号被封的情况,但是呢,如果筛号的频率太快,就会被系统限制筛号能力,不再返回筛号结果,所以,筛号数量和速度一定要控制好。前天逛街突然灵光一现,为什么不试试多路访问呢,简单来说就是信道复用技术,马上跑回家,调取接口,接入通道,导入已经转换成协议的账号,成功登录!

2403_87755661的博客 1941

60. 第k个排列 回溯法+数学法

60. 第k个排列 难度:中等 题目描述 解题思路 1、回溯法 就是很正常的全排列,然后设置一个计数位,如果count == k,就提前终止递归过程 /* * 60. 第k个排列 * 2020/9/5 * medium */ int count1 = 0; String res = ""; public String getPermutation(int n, int k) { StringBuild

hh155715的博客 265

【Unity】制作简易三维场景

本文介绍如何制作一个三维场景

CiNian_的博客 5331

RK3588开发笔记-Buildroot编译Qt5WebEngine-5.15.10

Rockchip RK3588是一款强大的多核处理器,广泛应用于边缘计算、人工智能、嵌入式系统等领域。为了在RK3588上运行自定义的Linux系统,并使用Qt5WebEngine进行Web内容渲染,Buildroot是一个非常合适的工具。本文将详细介绍如何使用Buildroot编译并配置Qt5WebEngine-5.15.10。Qt5WebEngine是Qt框架中的一个模块,它提供了一个功能强大的Web浏览器引擎,允许开发者在Qt应用程序中嵌入和显示现代网页内容。

flypig has a dream! 1157

第k个排列(C++)

给出集合 [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

pengshengli的博客 2271

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

60 Permutation Sequence

60 Permutation Sequence链接:https://leetcode.com/problems/permutation-sequence/ 问题描述: The set [1,2,3,…,n] contains a total of n! unique permutations.By listing and labeling all of the permutations in o

639

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

_21LeetCode代码随想录算法训练营第二十一天-回溯算法 | 77.组合

_21LeetCode代码随想录算法训练营第二十一天-回溯算法 | 77.组合

Jasmine-Lily的博客 229

leetcode记录60.Permutation Sequence

leetcode记录60.Permutation Sequence √ Accepted √ 200/200 cases passed (4 ms) √ Your runtime beats 66.46 % of cpp submissions √ Your memory usage beats 73.68 % of cpp submissions (8.3 MB) class S...

我的博客 229

LeetCode60 第k个排列(搜索+剪枝 | 思维)

题目链接:leetcode60 题目大意 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: “123” “132” “213” “231” “312” “321” 给定 n 和 k,返回第 k 个排列。 说明: 给定 n 的范围是 [1, 9]。 给定 k 的范围是[1, n!]。 输入: n = 3, k = 3 输出: “213” 输入: n = 4, k = 9 输出: "2314" 解题思路 数学

小胡同的诗 254

LeetCode算法打卡--全排列

46. 全排列 给定一个没有重复数字的序列,返回其所有可能的全排列。 链接:https://leetcode-cn.com/problems/permutations/ /* 基本思想:回溯递归的基本方法,从一个开始继续找下一个进行交换,递归的过程是后面的排列再加前面的数字 */ class Solution { public: void dfs(vector<int>...

qi_700的博客 242

[Leetcode][第77题][JAVA][组合][回溯]

【问题描述】[中等] 【解答思路】 1. 回溯 时间复杂度:O(N^2) 空间复杂度:O(1) class Solution { List<List<Integer>> lists = new ArrayList<>(); public List<List<Integer>> combine(int n, int k) { List<Integer> list = new ArrayLis

dadongwudi的博客 336

开始肝题目1

最后一个单词的长度 在这里插入代码片 `class Solution { public: int lengthOfLastWord(string s) { int ll=0,index=0; for(int i=0;i<s.size();i++) { if(s[i]==’ ') { index=0; } else index++;...

weixin_44077775的博客 260

从快递员视角看GIS:用TransCAD解决TSP和VRP,优化你的配送路线与车辆调度

本文从快递员视角出发,探讨如何利用交通地理信息系统(GIS)和TransCAD软件解决物流配送中的TSP(旅行商问题)和VRP(车辆路径问题),优化配送路线与车辆调度。通过实际案例和数据分析,展示了GIS技术在提升配送效率、降低成本和改善准点率方面的显著效果。

weixin_33744141的博客 275

【回溯算法】回溯的组合与排列问题

整理总结回溯算法中的组合与排列问题,其中核心在于了解回溯算法的思想与模板,熟悉组合与排序问题及剪枝优化,组合排序的去重问题是关键

weixin_46216674的博客 1469

leetcode 60.第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!]。 ...

EngineerHe的博客 1794

LeetCode 全排列,下一个排列,第k个排列等问题(C++)

1、全排列 问题描述 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 代码实现 class Solution { public: void backtrack(vector<vector<int>>& res, vector<int>& nums

bwqiang的博客 599

回溯算法C++详解(知识点+相关LeetCode题目)

本文章将从回溯算法的适用场景,使用方式展开,然后落实到使用回溯算法的经典力扣题目中,希望能对大家有所帮助

qq_60831089的博客 1532

【C++代码】求全排列、组合、子集

在力扣上刷到的这类题,做一个总结。思路相似,都可以用回溯(决策树)解决。 #include <iostream> #include <vector> #include <algorithm> using namespace std; // 全排列------------------------------------------------------------------------------------------------------------- //

WYuan的博客 2371

Permutation Sequence

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34315665的博客 82
上一篇: LeetCode 子集 & 子集II
下一篇: leetcode 77 组合 回溯 C++
BeforeEasy
博客等级 码龄10年 92粉丝 207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值