力扣算法题—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

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

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

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


相关推荐

  • Python 学习笔记 列表 range() xxx XXX

    Python 学习笔记 列表 range() xxx XXXPython学习笔记列表range()xxxXXXprint(“-“*30)forvalueinrange(1,5): print(value)numbers=list(range(1,6))print(numbers)even_numbers=list(range(2,11,2))print(even_numbers)squares=[]forvalueinr…

    2022年8月22日
    9
  • Fragment onResume不执行「建议收藏」

    Fragment onResume不执行「建议收藏」本博客解决的主要问题:在多个fragment切换的时候刷新各自的fragment,一般我们会优先想到onResume(),但是有时不起作用。解决办法:我们可以重写setUserVisibleHint()@OverridepublicvoidsetUserVisibleHint(booleanisVisibleToUser){super.setUserVis

    2022年6月2日
    212
  • java.sql.SQLException: ORA-01008: 并非所有变量都已绑定的解决方法「建议收藏」

    java.sql.SQLException: ORA-01008: 并非所有变量都已绑定的解决方法「建议收藏」错误:在使用PreparedStatement的时候,可以很好地避免像Statement的sql注入问题,但是在这里使用PreparedStatement对象和使用Statement对象来执行sql语句有一定的区别。PreparedStatement的对象通过:PreparedStatementp=con.preparedStatement(str);来执行sql语句,其中str是s…

    2025年9月6日
    12
  • 搭建个人网站需要的三个步骤

    记录一下自己的个人网站的搭建过程。其实网上有很多教程了,有的讲的好,很详细,有的就很笼统了,当然还有抄别人的,我这篇就纯属记录一下自己搭建的过程。搭建一个个人网站要知道以下三个步骤,做个比喻吧:域

    2021年12月26日
    88
  • TDD、FDD是什么意思?

    TDD、FDD是什么意思?TDD、FDD指第三代移动通信技术(3G)中的两种双工通信模式。TDD(Time-divisionDuplex)模式指时分双工模式,3G标准中的TD-SCDMA采用此双工模式;FDD(Frequency-divisionDuplex)模式指频分双工模式,3G标准中的WCDMA和CDMA2000采用此模式。一、工作原理TDD是一种通信系统的双工方式,在移动通信系统中用于分离接收…

    2022年4月27日
    65
  • python图像识别与提取_图像分类python

    python图像识别与提取_图像分类python前面一篇文章介绍了图像增强知识,从而改善图像质量,增强图像识别效果,核心内容分为直方图均衡化、局部直方图均衡化和自动色彩均衡三部分。这篇文章将详细讲解图像分类知识,包括常见的图像分类算法,并介绍Python环境下的贝叶斯图像分类算法、基于KNN算法的图像分类和基于神经网络算法的图像分类等案例。万字长文整理,希望对您有所帮助。同时,该部分知识均为作者查阅资料撰写总结,并且开设成了收费专栏,为小宝赚点奶粉钱,感谢您的抬爱。当然如果您是在读学生或经济拮据,可以私聊我给你每篇文章开白名单,或者转发原文给你,更希望

    2022年10月14日
    5

发表回复

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

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