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

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

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

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

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

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

说明:

  • 给定 n 的范围是 [1, 9]。
  • 给定 的范围是[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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 使用SpringBoot连接MySQL数据库,快速上手「建议收藏」

    使用SpringBoot连接MySQL数据库,快速上手「建议收藏」使用SpringBoot连接MySQL数据库,快速上手

  • eWebEditor漏洞分析

    eWebEditor漏洞分析现在eWebEditor在线编辑器用户越来越多,危害就越来越大。首先介绍编辑器的一些默认特征:   默认登陆admin_login.asp   默认数据库db/ewebeditor.mdb   默认帐号admin密码admin或admin888   在baidu/google搜索inurl:ewebeditor   几万的站起码有几千个是具有默认特征的,那么试一下默认后台   htt…

  • Pytorch版本、CUDA版本与显卡驱动版本的对应关系

    Pytorch版本、CUDA版本与显卡驱动版本的对应关系参考链接:INSTALLINGPREVIOUSVERSIONSOFPYTORCH解决PyTorch与CUDA版本不匹配1.CUDA驱动和CUDAToolkit对应版本注:驱动是向下兼容的,其决定了可安装的CUDA和CUDAToolkit的最高版本。2.CUDA及其可用PyTorch对应版本(参考官网,欢迎评论区补充)注:虽然有的卡CUDA版本可更新至新版本,且PyTorch也可对应更新至新版本。但有的对应安装包无法使用,有可能是由于卡太旧的原因。3.安装指导(1)指定安装PyTor

  • 画平行线的四种方法_苏教版画垂线教学反思

    画平行线的四种方法_苏教版画垂线教学反思平行线的画法教学反思(通用3篇)作为一名优秀的人民教师,我们的任务之一就是课堂教学,教学的心得体会可以总结在教学反思中,来参考自己需要的教学反思吧!下面是小编整理的平行线的画法教学反思(通用3篇),欢迎大家分享。平行线的画法教学反思1每到学习平行线的画法,总有学生学起来感到困难,用尺子移来移去,实在太麻烦,而且学生在以后也不容易记住。正是基于这样的认识画平行线的教学只能由教师传授给学生,他们也只能…

  • phpstorm 2021.7 激活码[免费获取][通俗易懂]

    (phpstorm 2021.7 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • JAVA面试中的SSM框架基础面试题[通俗易懂]

    JAVA面试中的SSM框架基础面试题[通俗易懂]javaSSM框架基础面试题SSM(Spring+Springmvc+Mybatis)框架面试题SpringSpringmvcMybaits一些基础面试题,对刚刚步入社会的2019届毕业生有帮助

发表回复

您的电子邮箱地址不会被公开。

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