LeetCode 60. Permutation Sequence

Solution0:
偷鸡摸狗的做法

class Solution {public:string getPermutation(int n, int k) {string str = "";for (int i = 1; i <= n; i++) {str += to_string(i);}while (k-- > 1) std::next_permutation(str.begin(), str.end());return str;}
};

Solution1:参考答案
20180708更:理解的更深刻了!棒!
博客转载自:http://www.cnblogs.com/grandyang/p/4358678.html
【年轻人要多学习才是啊~】
【自己想?这辈子都想不出这么好的思路。。。只有抄别人的了。。。】
思路:康拖编码
这道题是让求出n个数字的第k个排列组合,由于其特殊性,我们不用将所有的排列组合的情况都求出来,然后返回其第k个,我们可以只求出第k个排列组合即可,那么难点就在于如何知道数字的排列顺序,可参见网友喜刷刷的博客,首先我们要知道当n = 3时,其排列组合共有3! = 6种,当n = 4时,其排列组合共有4! = 24种,我们就以n = 4, k = 17的情况来分析,所有排列组合情况如下:
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412 <— k = 17
3421
4123
4132
4213
4231
4312
4321

我们可以发现,每一位上1,2,3,4分别都出现了6次,当第一位上的数字确定了,后面三位上每个数字都出现了2次,当第二位也确定了,后面的数字都只出现了1次,当第三位确定了,那么第四位上的数字也只能出现一次,那么下面我们来看k = 17这种情况的每位数字如何确定,由于k = 17是转化为数组下标为16:

最高位可取1,2,3,4中的一个,每个数字出现3!= 6次,所以k = 16的第一位数字的下标为16 / 6 = 2,即3被取出
第二位此时从1,2,4中取一个,k = 16是此时的k’ = 16 % (3!) = 4,而剩下的每个数字出现2!= 2次,所以第二数字的下标为4 / 2 = 2,即4被取出
第三位此时从1,2中去一个,k’ = 4是此时的k” = 4 % (2!) = 0,而剩下的每个数字出现1!= 1次,所以第三个数字的下标为 0 / 1 = 0,即1被取出
第四位是从2中取一个,k” = 0是此时的k”’ = 0 % (1!) = 0,而剩下的每个数字出现0!= 1次,所以第四个数字的下标为0 / 1= 0,即2被取出

那么我们就可以找出规律了
a1=k(n−1)!a1=k(n−1)!a_1 = \frac{k} { (n - 1)!}
k1=k%(n−1)!k1=k%(n−1)!k_1 = k \% (n - 1)!

a2=k1(n−2)!a2=k1(n−2)!a_2 = \frac{k_1}{(n - 2)!}
k2=k1%(n−2)!k2=k1%(n−2)!k_2 = k1 \% (n - 2)!

an−1=kn−21!an−1=kn−21!a_{n-1} = \frac{k_n-2}{1!}
kn−1=kn−2%1!kn−1=kn−2%1!k_{n-1} = k_{n-2} \%1!

an=kn−10!an=kn−10!a_n = \frac{k_{n-1}}{0!}
kn=kn−1%0!kn=kn−1%0!k_n = k_{n-1} \% 0!
代码如下:

class Solution {
public:string getPermutation(int n, int k) {string res;string num = "123456789";vector<int> f(n, 1);for (int i = 1; i < n; ++i) f[i] = f[i - 1] * i;--k;for (int i = n; i >= 1; --i) {int j = k / f[i - 1];k %= f[i - 1];res.push_back(num[j]);num.erase(j, 1);}return res;}
};

【数字全排列】LeetCode 60. Permutation Sequence相关推荐

  1. 60 Permutation Sequence

    60 Permutation Sequence 题目 The set [1,2,3,-,n] contains a total of n! unique permutations.By listing ...

  2. 60. Permutation Sequence

    一.题目 1.审题 2.分析 给两个数字 n 与 k,返回 1-n 所有数字组成的从小到大的全排序的第 k 个数. 二.解答 1.思路: 方法一.采用字典序列,返回全部序列后,输出第 k 个.(时间超 ...

  3. 全排列算法(无重复数字全排列/有重复数字全排列)/ 组合算法/ 求子集算法

    写在前面 全排列 1 无重复数字全排列 1.1 紫书版本 1.2 回溯法 2 有重复数字全排列 复盘易错点(可跳过) 写在前面 很久很久以前就想写的一篇博客,因为懒一直没开工,但是学习全排列算法算是我 ...

  4. 【数字全排列】LeetCode 31. Next Permutation

    LeetCode 31. Next Permutation 参考博客:http://www.cnblogs.com/grandyang/p/4428207.html Solution0:一个偷鸡摸狗的 ...

  5. 【字符串全排列】LeetCode 567. Permutation in String

    [字符串全排列]LeetCode 567. Permutation in String Solution1:[超时,未能AC] 得到s1的所有全排列组合,然后在s2中查找s1的全排列集合 因为超时,未 ...

  6. 康拓编码——Permutation Sequence

    描述 2.1.13 Permutation Sequence The set [1,2,3,ĉ ,n] contains a total of n! unique permutations. By l ...

  7. LeetCode60:Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  8. [Swift]LeetCode60. 第k个排列 | Permutation Sequence

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  9. C++ 实现康拓展开(leetcode 60)

    定义: 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆的. 原理介绍 X = A[0] * (n-1)! ...

最新文章

  1. Servlet 服务器端小程序
  2. Python--日志模块
  3. 关于c/c++/obj-c的混合使用 (2010-06-22 10:05:33)
  4. 关于SSM项目中配置文件的一些心得
  5. Office 365 On MacOS 系列——安装 O365 其他组件
  6. 2016保持谦卑,继续前行
  7. 华为手机连不上adb解决方法
  8. NERO-光盘刻录程序教程集
  9. C6678/C6657+ZYNQ/K7/A7 FPGA+AD+北斗的软硬件设计方案
  10. 通过Oracle的回收站恢复被删除的表浅谈
  11. region proposal
  12. DDR中的ODT功能详解及波形对比
  13. 【爬虫】9行python下载王者荣耀所有英雄的高清壁纸(附代码和图片下载)
  14. 基金的估值原来这么简单,一文看懂
  15. AD中出现off grid pin问题的解决方法
  16. 进程间通信之面包师问题
  17. 从移动互联网时代到物联网时代 梆梆安全追寻“本质安全”
  18. 在接下来的几周,Mt.gox可能会上演一出好戏
  19. UUUUUUUUUUnity
  20. URL详细分析及在python中处理URL

热门文章

  1. Python---copy()、deepcopy()与赋值的区别
  2. C# using的使用
  3. linux qemu原理,最全的剖析QEMU原理的文章3
  4. 加一条平行于y轴的直线_为什么龙门式桁架机器人采用V型导向滚轮直线导轨
  5. android date 组件,Android中TimePicker与DatePicker时间日期选择组件的使用实例
  6. mysql用来干嘛的_CPU占用又爆了?MySQL到底在干什么
  7. mysql 5.5 编译参数_mysql5.5编译安装
  8. 神经进化算法——利用NEAT算法解决迷宫导航问题(基于NEAT-Python)
  9. ios uistepper_iOS UIStepper
  10. android jni示例_Android CollapsingToolbarLayout示例