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[~] 分别为:                 
-----------------------------------------------------------------------------
输入 n=  k= src=""
如果 k= 直接返回 src, 当输入为k时,实际需要变化的次数为 k-1次。
因此 k=k- k=
-----------------------------------------------------------------------------
判断第1位是否需要更换: k> fac[] : >
.     更换的下标为: / =     因此des[]=src[]=‘’   des=""     取出src[]         src=""     k%=fac[] :        k= 判断第2位是否需要更换: k> fac[] : >.

    更换的下标为: / =     因此des[]=src[]=‘’。 des=""     取出src[]        src=""     k%=fac[] :       k= 判断第3位是否需要更换: k< fac[] : <.     src的首位不需要变化     因此des[]=src[]=‘’。 des=""     取出src[]        src=""     k没有变化        k= 判断第4位是否需要更换: k> fac[] : >.     更换的下标为: / =
    因此des[]=src[]=‘’。 des=""     取出src[]        src=""     k%=fac[]        k= 判断第5位是否需要更换: k> fac[] : >.     更换的下标为: / =     因此des[]=src[]=‘’。 des=""     取出src[]        src=""     k%=fac[]        k= 判断第6位是否需要更换: k> fac[] : >.     更换的下标为: / =     因此des[]=src[]=‘’。 des=""     取出src[]        src=""     k%=fac[]       k= 判断第7位是否需要更换: k> fac[] : >.     更换的下标为: / =     因此des[]=src[]=‘’。 des=""     取出src[]        src=""     k%=fac[]       k= 判断第8位是否需要更换: k>= fac[] : >=.     更换的下标为: / =     因此des[]=src[]=‘’。 des=""     取出src[]        src=""     k%=fac[]       k= 最后仅剩余src仅有1位,直接添加到des最后 des=”“

ok,上代码!

 class Solution {
public:
vector<int> fac;
string getPermutation(int n, int k) {
string src,des; fac.resize(,);
for(int i=;i<=n;i++) fac[i] = fac[i-]*i; if(k>fac[n]) return des;
for(int m=;m<=n;m++) src+=(''+m); //源字符串初始化 k--;
for(int j=n;j>;j--)
{
if(k>=fac[j-])
{
int temp = k/fac[j-];
k%=fac[j-];
des+=src[temp];
src.erase(temp,);
}
else
{
des+=src[];
src.erase(,);
}
}
des+=src[];
return des;
}
};

转载请注明出处: http://www.cnblogs.com/double-win/ 谢谢!

[LeetCode 题解]: Permutation Sequcence的更多相关文章

  1. LeetCode 题解 Permutation Sequence 需要优化!

    题目大意:给出n和k,找到1..n这些数组成的有序全排列中的第k个. 首先,n的全排列可以分成n组,每一组由n-1个数组成. 例如  3的全排列,分成三组: 1 2 3  和 1 3 2 2 1 3 ...

  2. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  3. LeetCode:60. Permutation Sequence,n全排列的第k个子列

    LeetCode:60. Permutation Sequence,n全排列的第k个子列 : 题目: LeetCode:60. Permutation Sequence 描述: The set [1, ...

  4. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  5. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  6. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  7. 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...

  8. 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)

    目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...

  9. 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...

随机推荐

  1. 嵌入式app框架

    推荐两个html5在手机app开发方面好的框架:phonegap + sencha. sencha touch是一个html5的重型框架,自带组件较多,一般应用可以凑合着使. phonegap可以将h ...

  2. 有关C#中的引用类型的内存问题

    对于一个类,如果定义后(记作对象a),将另外一个对象b直接赋值(“a = b”)给它,则相当于将地址赋值给了这个对象.当另外一个对象b不再对这块地址应用时,a由于对这块地址仍在使用,这块地址的指向的栈 ...

  3. Android Studio 2.3.3 添加ksoap2的引用(拒绝网上其他的忽悠),也适用于添加其他Jar的引用

  4. Java ArrayList的不同排序方法

    本文由 ImportNew - 温布利往事 翻译自 dzone.欢迎加入翻译小组.转载请见文末要求. 由于其功能性和灵活性,ArrayList是 Java 集合框架中使用最为普遍的集合类之一.Arra ...

  5. 谈谈跨平台的app开发 坚定的选择了flutter

    目前市场上,(市场也许用的不对),比较常见的技术有xamrin.RN.Flutter,确切的说flutter是后起之秀,笔者也是最近才开始学习,xamrin是微软系的技术,笔者也很早就开始学习了,RN ...

  6. 前端开发之HTML篇二

    主要内容: 一.表格标签 -- table 二.表单标签 -- form 三.常用标签属性和分类 四.标签嵌套规则 1️⃣  表格标签 -- table 表格由<table> 标签来定义. ...

  7. 69. Sqrt(x) (Divide-and-Conquer)

    Implement int sqrt(int x). Compute and return the square root of x. 注意: 计算平方的时候可能会溢出,所以mid要定义为long 另 ...

  8. Linux下各种解压命令

    本文介绍了linux下的压缩程式tar.gzip.gunzip.bzip2.bunzip2.compress .uncompress. zip. unzip.rar.unrar等程式,以及如何使用它们 ...

  9. 监控磁盘IO

    一.添加userparameter_io.conf配置文件 在/etc/zabbix/zabbix_agentd.d下添加userparameter_io.conf, 文件内容如下: UserPara ...

  10. Monkey&Monkey Runner使用

    adb shell monkey -p com.ajb.sp -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v ...