力扣算法题—060第K个排列

力扣算法题—060第K个排列

给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

给定 n 和 k,返回第 k 个排列。

说明:

  • 给定 n 的范围是 [1, 9]。
  • 给定 k 的范围是[1,  n!]。

示例 1:

输入: n = 3, k = 3
输出: "213"

示例 2:

输入: n = 4, k = 9
输出: "2314"
 1 #include "_000库函数.h"
 2 
 3 //一打眼看到题目描述,就想起用排列算法
 4 //时间有点长588ms
 5 
 6 class Solution {
 7 public:
 8     string getPermutation(int n, int k) {
 9         vector<int>v;
10         for (int i = 1; i <= n; ++i)
11             v.push_back(i);
12         --k;
13         while (next_permutation(v.begin(), v.end()) && --k);
14         string s = "";
15         for (auto a : v)
16             s += a + '0';
17         return s;
18     }
19 };
20 
21 //用一下递归
22 class Solution {
23 public:
24     string getPermutation(int n, int k) {
25         vector<int>v;
26         for (int i = 1; i <= n; ++i)
27             v.push_back(i);
28         Combin(v, 1, 0);
29         string s = "";
30         for (auto a : v)
31             s += a + '0';
32         return s;
33     }
34     void Combin(vector<int>&v, int k, int s) {
35         if (!k)return;
36         if (s >= v.size())--k;        
37         for (int i = s; i < v.size(); ++i) {
38             swap(v[i], v[s]);
39             Combin(v, k, s + 1);
40             swap(v[i], v[s]);
41         }
42     }
43 };
44     
45 //博客答案,没怎么看懂
46 //后期看懂再更新
47 //12ms
48 class Solution {
49 public:
50     string getPermutation(int n, int k) {
51         string res;
52         string num = "123456789";
53         vector<int> f(n, 1);
54         for (int i = 1; i < n; ++i) f[i] = f[i - 1] * i;
55         --k;
56         for (int i = n; i >= 1; --i) {
57             int j = k / f[i - 1];
58             k %= f[i - 1];
59             res.push_back(num[j]);
60             num.erase(j, 1);
61         }
62         return res;
63     }
64 };
65 
66 
67 void T060() {
68     Solution s;
69     cout << s.getPermutation(3, 3) << endl;
70     cout << s.getPermutation(4, 9) << endl;
71 }

 

转载于:https://www.cnblogs.com/zzw1024/p/10655043.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101001.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • opencv rectangle函数(python连接opencv库)

    因为做程序图像剪切一直不太明白是怎么切片的,这里就用cv2.rectangle这个函数来看一下opencv是怎么计量图像的坐标轴的。opencv官网上给出的cv2.rectangle函数定义如下:Python:cv2.rectangle(img,pt1,pt2,color[,thickness[,lineType[,shift]]])→Noneimg–…

    2022年4月14日
  • commonJS 和 es6规范 的引入导出

    commonJS 和 es6规范 的引入导出

    2022年2月23日
  • 关于服务器安装docker后无法ping通内网

    关于服务器安装docker后无法ping通内网

    2021年6月1日
  • 手机修改ntp服务器地址,修改手机ntp服务器ip地址[通俗易懂]

    手机修改ntp服务器地址,修改手机ntp服务器ip地址[通俗易懂]修改手机ntp服务器ip地址内容精选换一换本文介绍使用云手机服务时需要了解的基本概念。云手机是一台包含原生安卓操作系统,具有虚拟手机功能的云服务器,简单来说,云手机=云服务器+AndroidOS。您可以远程实时控制云手机,实现安卓APP的云端运行;也可以基于云手机的基础算力,高效搭建应用,如云游戏、移动办公、直播互娱等场景。服务器是用来提供云手机的物理服务器。云手机目前以服务器您可以直接修改虚…

    2022年5月24日
  • python执行cmd命令并解析结果_python如何打包成可执行程序

    python执行cmd命令并解析结果_python如何打包成可执行程序身为一个编程小白,最近刚刚接手工作。近期在使用pyinstaller的时候,发现了一个很严重的问题,那就是缺少包。当时并不知道,因为代码已经是上任大佬写好的,我可以直接用。先说一下问题吧(图片忘了保存)。执行文件突然死掉,当时手速够快截了一个图。原因是缺少了这么个包。pkg_resources.py2_warn具体的解决方法如下:顺便说一下,pyinstaller的安装方法,很简单。首先打开你的pycharm,然后点击左下角的Terminal之后输入命令 pipinstallpyins

    2022年8月28日
  • MySQL——MySQL 图形化管理工具的介绍「建议收藏」

    MySQL——MySQL 图形化管理工具的介绍「建议收藏」文章目录MySQL——MySQL图形化管理工具的介绍1、MySQLWorkbench2、Navicat3、SQLyog4、DBeaver5、DataGripMySQL——MySQL图形化管理工具的介绍MySQL图形化管理工具极大地方便了数据库的操作与管理,常用的图形化管理工具有:MysQLWorkbench、phpMyAdmin、NavicatPreminum、MySQLDumper、SQLyog、dbeaver、MysQLODBcConnector、DataGrip。1、MySQL

    2022年6月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号