leetcode — permutation-sequence
import java.util.ArrayList;
import java.util.List;
/**
* Source : https://oj.leetcode.com/problems/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.
*/
public class PermutationSequence {
/**
* 寻找n个元素组成的第k个排列
*
* 第一方法:
* 从最小的开始,循环k次找到第k个排列
*
* 第二种方法:
* 找到第k个排列的规律
*
* 这种题目,可以先以一个简单的例子来找规律
* 这里假设n = 4, k = 9
* 1234
* 1243
* 1324
* 1342
* 1423
* 1432
* 2134
* 2143
* 2314 >>>> k = 9
* 2341
* 2413
* 2431
* 3124
* 3142
* 3214
* 3241
* 3412
* 3421
* 4123
* 4132
* 4213
* 4231
* 4312
* 4321
*
* 以下认为arr下标从1开始
* 第一位:
* arr[4] = {1,2,3,4},k = 9,n = 4
* 上面的排列是有规律的,每个位置每一个数字出现cycle = (n-1) = (4-1)! = 6次,整体第k个的时候,该位置已经经过 count = k / cycle = 1个周期,则该位置的数是arr[count + 1] = 2,因为已经过了count个周期,是第count+1个周期,就轮到了数组arr中的第count+1个数字
*
* 第二位:
* arr[3] = {1,3,4},k' = k % (n-1)! = 3,n' = 3
* 右面一个位置的数字,以2开头,因为2已经确定,剩下的形成一个新的数组arr[3] = {1,3,4},每个位置每个数字出现cycle = (n' - 1) = (3-1)! = 2次,整体第k个的时候,对于当前数组组成的排列而言处于第k' = k % (n-1) = 3个,第三个的第一位这个时候已经经过count = k' / cycle = 1个周期,正处于第index = count + 1 = 2个周期,也就是该位置的数为arr[index]
*
* 第三位:
* arr[2] = {1,4},k'' = k' % (n'-1)! = 1,n'' = 2
* cycle = (n'' - 1)! = 1, count = k'' / cycle = 1,index = count + 1 = 2, arr[index] = 4
*
* 第四位:
* arr[1] = {1}, k''' = k'' % (n'' - 1)! = 0, n''' = 1
* cycle = (n''' - 1)! = 1,index = k''' / cycle + 1 = 1,arr[index] = 1
*
* @param n
* @param k
* @return
*/
public String getPermutation (int n, int k) {
if (n < 1) {
return "";
}
int[] fatorial = new int[n];
List<Integer> arr = new ArrayList<Integer>();
fatorial[0] = 1;
arr.add(1);
for (int i = 1; i < n; i++) {
fatorial[i] = fatorial[i-1] * i;
arr.add(i+1);
}
int index = 0;
// 因为数组下标是从0开始的,k--就是为了让数组下标从0开始
k--;
StringBuilder result = new StringBuilder();
while (n > 0) {
index = k / fatorial[n-1];
result.append(arr.get(index));
arr.remove(index);
k = k % fatorial[n-1];
n--;
}
return result.toString();
}
public static void main(String[] args) {
PermutationSequence permutationSequence = new PermutationSequence();
System.out.println(permutationSequence.getPermutation(4, 9));
System.out.println(permutationSequence.getPermutation(4, 24));
}
}
leetcode — permutation-sequence的更多相关文章
- [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]Permutation Sequence @ Python
原题地址:https://oj.leetcode.com/submissions/detail/5341904/ 题意: The set [1,2,3,…,n] contains a total of ...
- LeetCode: Permutation Sequence 解题报告
Permutation Sequence https://oj.leetcode.com/problems/permutation-sequence/ The set [1,2,3,…,n] cont ...
- 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] 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 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- [LeetCode] “全排列”问题系列(二) - 基于全排列本身的问题,例题: Next Permutation , Permutation Sequence
一.开篇 既上一篇<交换法生成全排列及其应用> 后,这里讲的是基于全排列 (Permutation)本身的一些问题,包括:求下一个全排列(Next Permutation):求指定位置的全 ...
- Java for LeetCode 060 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
Permutation Sequence The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and ...
- LeetCode:60. Permutation Sequence,n全排列的第k个子列
LeetCode:60. Permutation Sequence,n全排列的第k个子列 : 题目: LeetCode:60. Permutation Sequence 描述: The set [1, ...
随机推荐
- PIL: 建立一个GIF图
PIL: 建立一个GIF图 一.下载PIL库: PIL库的下载是:pip install pillow(pillow就是PIL函数了) 二.采用以下代码(有注释): import PIL.Imag ...
- 更新windows补丁时一直卡在搜索更新
在微软下载好安装补丁Windows8.1-KB2999226-x64后,双击时一直停留在“正在此计算机上搜索”界面. 解决方案: 1.将windows 自动更新设置为:“从不检查更新” . 2.关闭 ...
- 高级查询query
详细看 https://www.kancloud.cn/ldkt/tp5_db/229042
- C语言函数指针与 c#委托和事件对比
C语言: 函数指针可以节省部分代码量,写类似具有多态的函数,比如要比较最大值,如果不用函数指针就只能写比较某一类型比如int类型的max函数,这个max无法比较string的大小.函数指针的意义就不多 ...
- drools规则引擎中易混淆语法分析_相互触发导致死循环分析
整理了下最近在项目中使用drools出现的问题,幸好都在开发与测试阶段解决了,未波及到prod. 首先看这样两条规则: /** * 规则1_set默认利率a */ rule "rate_de ...
- C++代码审查---审查孙晓宁马踏棋盘谜题程序
与孙晓宁同学结对审查,其代码地址如下:https://github.com/brunnhilder/-1/blob/master/%E9%A9%AC%E8%B8%8F%E6%A3%8B%E7%9B%9 ...
- 随便写写,也有一些参考了我jio的很好的他人的成果
Spring框架学习记录(1) 一. https://www.cnblogs.com/yuanqinnan/p/10274934.html (一)只要用框架开发java,一定躲不过spring,Spr ...
- 我的C#跨平台之旅(四):使用AOP(filter、attribute)进行系统增强
1.使用OData提速REST API开发 引入NuGet包:Microsoft.AspNet.WebApi.OData 在启动类中添加如下配置(示例为全局配置,也可基于Controller或Acti ...
- Android开发者的Anko使用指南(三)之资源
添加依赖 dependencies { compile "org.jetbrains.anko:anko-commons:$anko_version" } Color 0xff00 ...
- Ettercap 实施中间人攻击
中间人攻击(MITM)该攻击很早就成为了黑客常用的一种古老的攻击手段,并且一直到如今还具有极大的扩展空间,MITM攻击的使用是很广泛的,曾经猖獗一时的SMB会话劫持.DNS欺骗等技术都是典型的MITM ...