文章目录

  • 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个排列(回溯 康托展开)相关推荐

  1. LeetCode —— 60. 第k个排列(Python3)

    给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132&qu ...

  2. LeetCode 60. 第k个排列(python、c++)

    题目描述 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "1 ...

  3. Leetcode算法Java全解答--60. 第k个排列

    Leetcode算法Java全解答–60. 第k个排列 文章目录 Leetcode算法Java全解答--60. 第k个排列 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 ...

  4. LeetCode 中级 - 第k个排列(60)

    可以用数学的方法来解, 因为数字都是从1开始的连续自然数, 排列出现的次序可以推算出来, 对于n=4, k=15 找到k=15排列的过程:1 + 对2,3,4的全排列 (3!个) 2 + 对1,3,4 ...

  5. [Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯搜索算法 + 剪枝 ,直接来到叶子结点 时间复杂度:O(N^2) 空间复杂度:O(N) import java.util.Arrays;public cl ...

  6. leetcode60.第k个排列java题解

    LeetCode 60.第k个排列 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: 1. "1 ...

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

    [问题描述][中等] [解答思路] 1. 回溯 class Solution {List<List<Integer>> lists = new ArrayList<> ...

  8. 关于康托展开和逆康托展开详解,及python代码

    在LeetCode上有这样一道题: 60. 第k个排列 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: ...

  9. Vijos1029[晴天小猪历险记之Number] 搜索+康托展开

    康托展开: 康托展开表示的是当前n个元素排列在n个不同元素的全排列中的名次. 比如213在这3个数所有排列中排第3. 那么,对于n个数的排列,康托展开为: ans=an*(n-1)!+an-1*(n- ...

最新文章

  1. android 设置布局横屏竖屏
  2. MapReduce的编程规范
  3. Navcat:1251 client does not support ...问题
  4. 【OJ】洛谷循环结构题单题解锦集
  5. AngularJS之高级Route【三】(八)
  6. Unity基础学习笔记(一)
  7. 用python生成一段关于文字的二维码(关于刷网课的)
  8. 不能将下载行为传输到IDM插件的解决方法
  9. python编写程序输出诗句_python基于词向量的古诗生成器
  10. 蓝桥杯 算法训练 合集1 C++
  11. [转载]分布式双活数据中心
  12. redis 持久化和恢复
  13. 02-CSS基础与进阶-day7_2018-09-07-20-25-28
  14. 怎么Collections.sort()方法进行List排序
  15. 基于案例的软件构造教程学期大作业-100以内的加减法
  16. 函数式接口Stream类
  17. 面试复习题--锁的细枝末节
  18. 区块链与人工智能技术融合 AI复制人类智能
  19. react视频播放组件Griffith的基本使用
  20. postgresql数据库命令行授权实操

热门文章

  1. c#中bin,obj,properties文件夹的作用
  2. 网络层核心:路由和路由生成算法
  3. 动态查找表之二叉搜索树
  4. Python学习之路——装饰器
  5. 魔戒(思维+bfs)
  6. IOS的 testflight测试设置
  7. javascript自定义startWith()和endWith()方法
  8. oracle 从别的数据库获取数据 ,访问其他数据库
  9. UVa 11636 Hello World!
  10. 解剖8051内核如何进行多任务切换