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的更多相关文章

  1. [LeetCode] Permutation Sequence 序列排序

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  2. [leetcode]Permutation Sequence @ Python

    原题地址:https://oj.leetcode.com/submissions/detail/5341904/ 题意: The set [1,2,3,…,n] contains a total of ...

  3. LeetCode: Permutation Sequence 解题报告

    Permutation Sequence https://oj.leetcode.com/problems/permutation-sequence/ The set [1,2,3,…,n] cont ...

  4. LeetCode——Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  5. [Leetcode] Permutation Sequence

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  6. 【LeetCode】60. Permutation Sequence 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. [LeetCode] “全排列”问题系列(二) - 基于全排列本身的问题,例题: Next Permutation , Permutation Sequence

    一.开篇 既上一篇<交换法生成全排列及其应用> 后,这里讲的是基于全排列 (Permutation)本身的一些问题,包括:求下一个全排列(Next Permutation):求指定位置的全 ...

  8. 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 ...

  9. 【LeetCode练习题】Permutation Sequence

    Permutation Sequence The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and ...

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

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

随机推荐

  1. SAS 循环与数组

    SAS 循环与数组 SAS提供了循环语句以满足在编程中需要多次执行相同操作的情 况.有时还需要对不同的变量执行相同的操作,此时可定义SAS数组,并通过数组名和下标来引用这些变量. 1 循环 SAS循环 ...

  2. 你了解栈溢出StackOverFloweExeption的原理吗?

    StackOverflowException的常见几种引起的方式 1.类的相互引用 2.方法的循环调用 3.属性Set方法的死循环调用 class Program : IProgram { IPers ...

  3. Python基础环境搭建

    一.编程语言 1.解释型语言:每执行一次程序就要将代码翻译一次,如Java.JavaScript.VBScript.Perl.Python.Ruby.MATLAB 等都是解释型语言 2.编译型语言:程 ...

  4. redis_简单动态字符串

    在redis中,C字符串(以'\0'结尾的字符数组)只用在一些无需对字符串值进行修改的地方,比如打印日志.其他情况,redis使用SDS - SimpleDynamicString 简单动态字符串,来 ...

  5. 下划线“_”在oracle中不是单纯的表示下划线的意思,而是表示匹配单一任何字符!

    [解决办法]1.使用 escape() 函数escape关键字经常用于使某些特殊字符,如通配符:'%','_'转义为它们原来的字符的意义,被定义的转义字符通常使用'\',但是也可以使用其他的符号.例如 ...

  6. vue computed计算属性和watch监听属性解疑答惑

    computed计算属性     计算属性类似于方法,用于输出data中定义的属性数据的结果,data数据变化时,计算属性的结果会同步变化,需要注意的是计算属性不可与data定义的属性同名. 相比于方 ...

  7. python中字典的操作

    ----------字典操作------------ --查字典1. 字典名["元素名称"]2. 字典名.get("元素名称")-获取不存在得元素名称,.get ...

  8. Flask框架(二)

    request @app.route('/requests/', method=['GET', 'POST']) def req(): print(request.data) #请求方式 print( ...

  9. 复习java基础

    十进制转换成二进制:     方法:整除法,计数方式从右往左,二进制中非0即1.例子如下: 计数方式是从右往左进行,然后填写数字的顺序是余数优先 二进制转换成十进制: 方法:乘二法,例如二进制数字为: ...

  10. Web browse的发展演变

    Web browse 译为中文是网络浏览器或网页浏览器. Web浏览器如今可谓遍地开花,无论你最终选择了什么浏览器,你可能都会举得他们的功能性想当然的,但是你们可能不知道这些Web浏览器是20年发展的 ...