博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode 题解]: Permutation Sequcence
阅读量:5166 次
发布时间:2019-06-13

本文共 3037 字,大约阅读时间需要 10 分钟。

The set [1,2,3,…,n] contains a total of n! unique permutations.

By listing and labeling all of the permutations in order,

We get the following sequence (ie, for n = 3):

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

Given n and k, return the kth permutation sequence.

Note: Given n will be between 1 and 9 inclusive.

--------------------------------------------------------------------------------------------------------------

题解: 套用DFS模版居然超时了。。。。看来lzDFS还是不过关啊!

lz怒了有木有,难道一定要DFS一个一个找吗?能不能直接找规律呢?

经过推算,lz终于找到一个规律了,0(N)就能搞定啊!!!

从全排列的产生可以看出,变化都是先从低位开始换位的。(此处高位指的是数组中下标减小的方向)

如果想引起A[i]的变化,需要A[i+1]~A[n]完成一次全排列,即需要 (n-i-1)! 次 这个结果即为 fac(n-i-1).

好吧,貌似好抽象! 给一个形象地例子,尝试着解释一下:

1到9的阶乘如下 fac[1~9] 分别为:  1  2  6  24  120  720  5040  40320  362880-----------------------------------------------------------------------------输入 n=9  k=171996    src="123456789"如果  k=1 直接返回 src, 当输入为k时,实际需要变化的次数为 k-1次。因此 k=k-1  k=171995-----------------------------------------------------------------------------判断第1位是否需要更换:   k> fac[8] : 171995>40320.    更换的下标为:  171996/40320 = 4    因此des[0]=src[4]=‘5’   des="5"    取出src[4]         src="12346789"    k%=fac[8] :         k=10716判断第2位是否需要更换:   k> fac[7] : 10715>5040.    更换的下标为:  10716/5040 = 2    因此des[2]=src[2]=‘3’。  des="53"    取出src[2]        src="1246789"    k%=fac[7]  :       k=635判断第3位是否需要更换:   k< fac[6] : 635<720.    src的首位不需要变化    因此des[3]=src[0]=‘1’。 des="531"      取出src[0]        src="246789"    k没有变化        k=635判断第4位是否需要更换:   k> fac[5] : 635>120.    更换的下标为:  635/120 = 5    因此des[4]=src[5]=‘9’。 des="5319"      取出src[5]        src="24678"    k%=fac[5]        k=35判断第5位是否需要更换:   k> fac[4] : 35>24.    更换的下标为:  35/24 = 1    因此des[5]=src[1]=‘4’。 des="53194"      取出src[1]        src="2678"    k%=fac[4]        k=11判断第6位是否需要更换:   k> fac[3] : 11>6.    更换的下标为:  12/6 = 1    因此des[6]=src[1]=‘6’。 des="531946"      取出src[1]        src="278"    k%=fac[3]       k= 5判断第7位是否需要更换:   k> fac[2] : 5>2.    更换的下标为:  5/2 = 2    因此des[7]=src[2]=‘8’。 des="5319468"      取出src[1]        src="27"    k%=fac[2]       k= 1判断第8位是否需要更换:   k>= fac[1] : 1>=1.    更换的下标为:  1/1 = 1    因此des[7]=src[2]=‘7’。 des="53194687"      取出src[1]        src="2"    k%=fac[2]       k= 0最后仅剩余src仅有1位,直接添加到des最后 des=”531946872“

ok,上代码!

 

1 class Solution { 2 public: 3     vector
fac; 4 string getPermutation(int n, int k) { 5 string src,des; 6 7 fac.resize(10,1); 8 for(int i=2;i<=n;i++) fac[i] = fac[i-1]*i; 9 10 if(k>fac[n]) return des;11 for(int m=1;m<=n;m++) src+=('0'+m); //源字符串初始化12 13 k--;14 for(int j=n;j>1;j--)15 {16 if(k>=fac[j-1])17 {18 int temp = k/fac[j-1];19 k%=fac[j-1];20 des+=src[temp];21 src.erase(temp,1);22 }23 else24 {25 des+=src[0];26 src.erase(0,1);27 }28 }29 des+=src[0];30 return des;31 }32 };

 转载请注明出处: 谢谢!

转载于:https://www.cnblogs.com/double-win/p/3794887.html

你可能感兴趣的文章
mybatis获得刚刚插入的自增的值
查看>>
读《不要等到毕业以后》后感
查看>>
Eureka常见问题
查看>>
自反acl
查看>>
从前端优化反观浏览器渲染原理
查看>>
基于Asterisk的VoIP开发指南——(2)Asterisk AGI程序编写指南
查看>>
ASP.NET MVC HtmlHelper用法大全
查看>>
在IIS中部署Asp.Net网站
查看>>
UITabBarController使用详解
查看>>
LeetCode - ZigZag Conversion
查看>>
windows服务安装卸载
查看>>
C# Dictionary<TKey,TValue>如何添加键重复的内容
查看>>
第五篇:web之前端之float的几种清除浮动方式
查看>>
三剑客之grep
查看>>
Workerman-文件监控-牛刀小试
查看>>
Shiro 自定义登陆、授权、拦截器
查看>>
在centos5开启telnet服务并验证
查看>>
docker容器操作
查看>>
HTML学习---基础知识学习
查看>>
ng跳转映射,被阿里云的云盾拦截,提示备案问题分析
查看>>