60. 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):
"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.
给定n,排列成n位数,会有n!种组合,按大小排列,输出第k个数的值。
代码:
该题目看起来就不是那么复杂,但是是medium的,说明把所有的数字排出来,排序,肯定是不行的。
于是,观察规律,肯定要先确定最高位的数字。1-n无论哪一个数字在最高位,都对应(n-1)!个组合的数字。
当k>(n-1)!且k<2*(n-1),说明第一位数字是2,因为1开头的排完了,也没有排到K,但也不会比两个(n-1)!大,所以首位可以确定。
当k<(n-1)!,自然首位就是剩余元素中最小的那个。比如一开始1-n,自然就是1了。
根据该规律,分情况,递归求出每次剩余元素中应该放在首位的那个,用链表记录1-n个元素,方便删除操作,首位用栈记录(方便):
java代码,不难理解,但还是试了半天,哎。。。:
//递归求阶乘
public int factorial(int n) {
if(n>1) {
n = n*factorial(n-1);
}
return n;
}
//从首位开始,递归入栈每一位对应元素
ArrayDeque<Integer> stack=new ArrayDeque<Integer>();
public void getFirstNum(List<Integer> num,int k) {
int i = 1;
int n=num.size();
int temp = factorial(n-1);
//每次当n为1的时候,只有一个元素了,直接入栈并退出函数
if(n==1) {
stack.push((Integer) num.get(0));
System.out.println("入栈: "+(Integer) num.get(0));
return;
}
//k小于(n-1)!,所以直接取链表中最小的数为首位,入栈
if(temp >=k) {
stack.push((Integer) num.get(0));
System.out.println("入栈: "+(Integer) num.get(0));
num.remove(0);
getFirstNum(num,k);
}
else {
//k大于(n-1)!,循环找出k大于几个(n-1)!
while (i*temp < k){
i++;
//k大于i个(n-1)!,取链表中第i个位置对应的数为首位,入栈
if(i*temp >= k) {
stack.push((Integer) num.get(i-1));
System.out.println("入栈: "+(Integer) num.get(i-1));
num.remove(i-1);
k = k-(i-1)*factorial(n-1);
getFirstNum(num,k);
break;
}
}
}
}
//获得相应位置的排列
public String getPermutation(int n, int k) {
if(n==0){return null;}
int result_int = 0;
String result_str = null;
ArrayList<Integer> num = new ArrayList<Integer>(n);
for (int j=1;j<=n;j++) {
num.add(j);
}
getFirstNum(num,k);
while(!stack.isEmpty()) {
result_int= result_int*10+ stack.pollLast();
}
System.out.println("第"+k+"元素是: "+result_int);
result_str = String.valueOf(result_int);
return result_str;
}
结果:
60. Permutation Sequence的更多相关文章
- LeetCode:60. Permutation Sequence,n全排列的第k个子列
LeetCode:60. Permutation Sequence,n全排列的第k个子列 : 题目: LeetCode:60. Permutation Sequence 描述: The set [1, ...
- LeetCode 31 Next Permutation / 60 Permutation Sequence [Permutation]
LeetCode 31 Next Permutation / 60 Permutation Sequence [Permutation] <c++> LeetCode 31 Next Pe ...
- 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 60. Permutation Sequence(康托展开)
描述: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of t ...
- 【LeetCode】60. Permutation Sequence
题目: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of t ...
- 【一天一道LeetCode】#60. Permutation Sequence.
一天一道LeetCode系列 (一)题目 The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and ...
- LeetCode OJ 60. Permutation Sequence
题目 The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of th ...
- 60. Permutation Sequence (String; Math)
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- 60. Permutation Sequence(求全排列的第k个排列)
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
随机推荐
- html 常用标签补充
<body> <!--预处理标签 <pre>--> <pre> 你好, 空格 换3行. 你<sup>上标</sup>好<s ...
- Hadoop 之Mong DB 之CentOS 6 使用 yum 安装MongoDB及服务器端配置
安装MongoDB的方法有很多种,可以源代码安装,在Centos也可以用yum源安装的方法.由于MongoDB更新得比较快,我比较喜欢用yum源安装的方法.64位Centos下的安装步骤如下: 1.准 ...
- Linux/CentOS 同步网络时间
由于硬件的原因,机器或多或少的跟标准时间对不上,一个月的误差几秒到几分钟不等.对于服务器来说时间不准,会有很多麻烦.例如,支付的时候,无法下单,游戏无法登录等. 方法一:用 ntpdate从时间服务器 ...
- Ajax的使用
Ajax是JQuery实现XMLHttpRequest的一种方式. 增加HTML5按钮,含有点击事件: <button type="button" class="b ...
- 解决Button设置disabled后无法执行后台代码问题
一.开始调式下面的程序,发现Button在js中设置disabled后无法执行后台代码(btnsave_Click)问题 <asp:Button ID="btnsave" r ...
- Sql统计一个字符串在另一个字符串出现的次数的函数-fnQueryCharCountFromString
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ),)) returns int as begin declare @pos int,@n int , ...
- Promise 原理探究及其简单实现
可移步 http://donglegend.com/2016/09/11/promise%E5%8E%9F%E7%90%86%E6%8E%A2%E7%A9%B6/ 观看 Promise是个什么玩意,大 ...
- HDU 5128 The E-pang Palace(2014广州赛区现场赛B题 计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5128 解题报告:在一个平面上给出n个点的坐标,用这n个点作为矩形的四个顶点,作两个矩形,要求两个矩形不 ...
- css3 animation 属性众妙
转自:凹凸实验室(https://aotu.io/notes/2016/11/28/css3-animation-properties/) 本文不会详细介绍每个 css3 animation 属性(需 ...
- angularjs获取参数方法
链接:/tab/newsview?id=58 .controller('NewsViewCtrl', ["$scope", "$location"," ...