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, n!]。示例 1:
输入: n = 3, k = 3
输出: "213"示例 2:
输入: n = 4, k = 9
输出: "2314"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 回溯
class Solution {public:string getPermutation(int n, int k) {string ans, temp;bool visited[10] = {0};int count = 0;permute(n, k, count, 0, temp, ans, visited);return ans;}void permute(int &n, int &k, int& count, int bit, string &temp, string &ans, bool* visited){if(count > k)return;if(bit == n){count++;if(count == k)ans = temp;}for(int i = 1; i <= n; i++){if(visited[i])// i写入了答案,继续下一个数continue;temp.push_back(i+'0');visited[i]=true;permute(n, k, count, bit+1, temp, ans, visited);temp.pop_back();visited[i]=false;}}
};
2.2 数学-康托展开
class Solution {public:string getPermutation(int n, int k) {int factor[10] = {1,1,2,6,24,120,720,5040,40320,362880};//阶乘数string num = "123456789";string ans;int bit;while(n > 0){bit = (k-1)/factor[n-1];//确定第一位数的时候,后面有f[n-1]种排列ans.push_back(num[bit]);num.erase(num.begin()+bit);//该位数写入答案了,删除k -= bit*factor[n-1];n--;}return ans;}
};
LeetCode 60. 第k个排列(回溯 康托展开)相关推荐
- LeetCode —— 60. 第k个排列(Python3)
给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132&qu ...
- LeetCode 60. 第k个排列(python、c++)
题目描述 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "1 ...
- Leetcode算法Java全解答--60. 第k个排列
Leetcode算法Java全解答–60. 第k个排列 文章目录 Leetcode算法Java全解答--60. 第k个排列 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 ...
- LeetCode 中级 - 第k个排列(60)
可以用数学的方法来解, 因为数字都是从1开始的连续自然数, 排列出现的次序可以推算出来, 对于n=4, k=15 找到k=15排列的过程:1 + 对2,3,4的全排列 (3!个) 2 + 对1,3,4 ...
- [Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]
[问题描述][中等] [解答思路] 1. 回溯搜索算法 + 剪枝 ,直接来到叶子结点 时间复杂度:O(N^2) 空间复杂度:O(N) import java.util.Arrays;public cl ...
- leetcode60.第k个排列java题解
LeetCode 60.第k个排列 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: 1. "1 ...
- [Leetcode][第77题][JAVA][组合][回溯]
[问题描述][中等] [解答思路] 1. 回溯 class Solution {List<List<Integer>> lists = new ArrayList<> ...
- 关于康托展开和逆康托展开详解,及python代码
在LeetCode上有这样一道题: 60. 第k个排列 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: ...
- Vijos1029[晴天小猪历险记之Number] 搜索+康托展开
康托展开: 康托展开表示的是当前n个元素排列在n个不同元素的全排列中的名次. 比如213在这3个数所有排列中排第3. 那么,对于n个数的排列,康托展开为: ans=an*(n-1)!+an-1*(n- ...
最新文章
- android 设置布局横屏竖屏
- MapReduce的编程规范
- Navcat:1251 client does not support ...问题
- 【OJ】洛谷循环结构题单题解锦集
- AngularJS之高级Route【三】(八)
- Unity基础学习笔记(一)
- 用python生成一段关于文字的二维码(关于刷网课的)
- 不能将下载行为传输到IDM插件的解决方法
- python编写程序输出诗句_python基于词向量的古诗生成器
- 蓝桥杯 算法训练 合集1 C++
- [转载]分布式双活数据中心
- redis 持久化和恢复
- 02-CSS基础与进阶-day7_2018-09-07-20-25-28
- 怎么Collections.sort()方法进行List排序
- 基于案例的软件构造教程学期大作业-100以内的加减法
- 函数式接口Stream类
- 面试复习题--锁的细枝末节
- 区块链与人工智能技术融合 AI复制人类智能
- react视频播放组件Griffith的基本使用
- postgresql数据库命令行授权实操