LeetCode60:Permutation Sequence
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.
Backtracking Math
这道题最直观的的解法就是先求出全部的排列,然后再从结果中找到第k个值就可以。可是非常明显会超时。
假设不能先将全部的排列都求出来,那么这道题的目的就是让我们直接找到第k个排列了。
那么怎样找到第k个排列?直接要找到规律可能会比較困难,可是能够使用回溯和动态规划的一般方法,即使用用例来分析,从特殊到一般。看看通过这个特殊的用例能不能找到通用的方法,可是使用用例分析可能会因为用例选取的不全而导致遗漏一些情况,这道题做到最后就是用例选取的不全导致改了好久。
取n=3,k=5,那么输出应该是第5个排列”312”。
能够发现n=3时的全部排列中以1开头的排列有2个,以2开头的排列有2个,以3开头的排列有2个。
排列的个数取决于后面的数有多少种排列,这里后面有2个数,排列的个数是2!=2。
于是对于k=5能够这么分析
5/2=2;
5%2=1
即将[123]第0位的数字1和第2位的数字3交换,第0位就处理好了,如今数组变成[321],接着指针移到到第1位。然后将第1位到最后的元素排序。数组变成了[312],然后求[12]中的第1个数。
可是这样的求解方法会有一点问题,那就是本来5和6应该都是和第2位交换,可是因为6/2=3,结果变成了第0位和第3位交换,非常明显这是错误的,我们应该使用它在结果集中的下标来使用这个元素。对于k=5,实际上是第k-1=4个元素。对于4:
4/2=2;
4%2=0
它表示第0个元素要和第2个元素交换,这时第0个元素就处理好了,然后再在后面的2个元素构成的排列中查询第4%2=0个元素,当全部的元素都处理好了以后,这个数组中的元素就是我们要找的第k个排列了。
runtime:4ms
class Solution {
public:
string getPermutation(int n, int k) {
arr=new char[n];
for(int i=0;i<n;i++)
arr[i]=i+'1';
helper(0,n,k-1);
string str;
for(int i=0;i<n;i++)
str+=arr[i];
return str;
}
void helper(int pos,int num,int k)
{
if(pos==num-1)
return ;
int base=k/fac(num-pos-1);
int remain=k%fac(num-pos-1);
sort(arr+pos,arr+num);
swap(arr[pos],arr[pos+base]);
helper(pos+1,num,remain);
}
int fac(int n)
{
int result=1;
for(int i=1;i<=n;i++)
result*=i;
return result;
}
private:
char *arr;
};
LeetCode60:Permutation Sequence的更多相关文章
- LeetCode31 Next Permutation and LeetCode60 Permutation Sequence
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- Leetcode60. Permutation Sequence第k个排列
给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132&qu ...
- [Swift]LeetCode60. 第k个排列 | Permutation Sequence
The set [1,2,3,...,n] contains a total of n! unique permutations. By listing and labeling all of the ...
- Permutation Sequence
The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- [LeetCode] Permutation Sequence 序列排序
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- Leetcode 60. Permutation Sequence
The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- 【leetcode】 Permutation Sequence (middle)
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- 60. Permutation Sequence
题目: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of t ...
- [Leetcode] Permutation Sequence
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
随机推荐
- 数据清洗——python定位csv中的特定字符位置
之前发过一篇关于定位csv中的特殊字符的,主要是用到了python的自带的函数,近期又遇到了一些新的问题,比如isdigit()的缺点在于不能判断浮点型,以及小数中有多个小数点的情况.发现还是正则表达 ...
- asp.net mvc 最简单身份验证 [Authorize]通过的标准
[Authorize] public ContentResult Index2() { return Content("验证通过了"); } 经常能够看到某个Controler下的 ...
- java环境搭建(及安装问题“No repository found containing”解决) 并创立第一个java程序
环境: java8 及 Eclipse java8 配置:http://jingyan.baidu.com/article/e2284b2b5967e7e2e7118d74.html Eclipse ...
- SAS进阶《深入解析SAS》之开发多语言支持的SAS程序
SAS进阶<深入解析SAS>之开发多语言支持的SAS程序 1. 多语言支持的应用程序是指该程序在世界给第使用时,其能够处理的数据,以及处理数据的方式.信息展现的方式都符合当地的语言.文化习 ...
- 移动web——bootstrap如何修改原组件
基本介绍 1.bootstrap提供了丰富的组件,但是有时候我们不仅要删除不必要的标签,还需要修改里面的样式 2.我们建议若是修改样式那么最好将源样式从css中拷贝出来,名字换掉,然后修改具体样式,这 ...
- jQuery——事件操作
事件绑定 1.简单事件绑定 $("button").click(function () {})//可重复绑定,不会被层叠 2.bind():不推荐使用 $("button ...
- 通过offset值的设置使html元素对齐
今天是我第一次写这个随笔,为了记录我发现的一个jquery的offset的值的问题. 这个offset的值会因为页面标签是否处于隐藏状态而表现出不同的值,隐藏状态时,offset的值是相对于直接父亲的 ...
- day13-迭代器、三元表达式、列表推导式、字典生成式、生成器与递归
目录 迭代器 可迭代对象 迭代器对象 for循环原理 三元表达式(三目表达式) 列表推导式 字典生成式 zip()方法 生成器 生成器表达式 递归 递归的两个阶段 迭代器 迭代器即迭代的工具,迭代是一 ...
- 浏览器加载 CommonJS 模块的原理与实现 (阮一峰大哥的 http://www.ruanyifeng.com/blog/2015/05/commonjs-in-browser.html)
就在这个周末,npm 超过了 cpan ,成为地球上最大的软件模块仓库. npm 的模块都是 JavaScript 语言写的,但浏览器用不了,因为不支持 CommonJS 格式.要想让浏览器用上这些模 ...
- Java中内部类详解—匿名内部类
什么是内部类? 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类. 成员内部类 定义在类中方法外的类. 定义格式: class 外部类 { class 内部类{ } } ...