[LeetCode 题解]: Permutation Sequcence
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):
"123"
"132"
"213"
"231"
"312"
"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的更多相关文章
- LeetCode 题解 Permutation Sequence 需要优化!
题目大意:给出n和k,找到1..n这些数组成的有序全排列中的第k个. 首先,n的全排列可以分成n组,每一组由n-1个数组成. 例如 3的全排列,分成三组: 1 2 3 和 1 3 2 2 1 3 ...
- 【LeetCode题解】二叉树的遍历
我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...
- LeetCode:60. Permutation Sequence,n全排列的第k个子列
LeetCode:60. Permutation Sequence,n全排列的第k个子列 : 题目: LeetCode:60. Permutation Sequence 描述: The set [1, ...
- leetcode题解-122买卖股票的最佳时期
题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...
- 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
- 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)
目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...
- 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)
目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...
- 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)
目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...
- 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...
随机推荐
- 20_java之集合Map
01Map集合概述 A:Map集合概述: 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同 a:Collection中的集合,元素是孤立 ...
- 11_java之接口和多态
01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来 ...
- linux中args工具
三.xargs xargs - build and execute command lines from standard input 在使用find命令的-exec选项处理匹配到的文件时, find ...
- Halcon学习之七:改变图像的现实方式和大小
change_format ( Image : ImagePart : Width, Height : ) 改变Image图像大小,而且ImagePart图像为灰度值图像. crop_domain ( ...
- sitemap和sitemapindex
介绍: https://support.google.com/webmasters/answer/75712?hl=zh-Hans 实例: http://www.thepaper.cn/sitemap ...
- .net core 2.0的一次奇特经历
环境:.net core SDK版本 2.0.0-preview1-005977 VS 2017 version 15.3.0 preview 3.0 问题描述:今天在迁移Job的项目中,中午吃饭的时 ...
- PHP笔试题及答案
1.表单提交get和post有何区别? 答:get的方式是把数据在地址栏中发送,get传送的数据量较小,不能大于2KB.post传送的数据量较大,一般被默认为不受限制.但理论上,IIS4中最大量为80 ...
- TI XDC工具入门简介
1. XDC(Express DSP Component)是TI提供的一个命令行工具,它可以生成并使用实时软件组件包,它包括一系列工具,这些工具可以允许你将你的C语言代码组织成类似于java的包管理方 ...
- 《Android Studio实用指南》7.1 AndroidStudio代码检查工具概述
本文节选自<Android Studio实用指南> 作者: 毕小朋 目前本书已上传到百度阅读, 在百度中搜索[Anroid Studio实用指南]便可以找到本书. Android Stud ...
- Cannot subclass final class class com.sun.proxy.$Proxy16
Cannot subclass final class class com.sun.proxy.$Proxy16 2016年05月04日 19:10:58 阅读数:15028 背景 这个错误是我在使用 ...