今天和大家聊的问题叫做 第k个排列,我们先来看题面:
https://leetcode-cn.com/problems/permutation-sequence/
The set [1,2,3,...,n] contains a total of n! unique permutations.
题意
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
"123""132""213""231""312""321"给定 n 和 k,返回第 k 个排列。说明:给定 n 的范围是 [1, 9]。给定 k 的范围是[1, n!]。
样例
示例 1: 输入: n = 3, k = 3 输出: "213" 示例 2: 输入: n = 4, k = 9 输出: "2314"
解题
这道题就是个找规律题目!直接举例子:比如n = 3, k = 3
我们要由num = [1, 2, 3]
这三个数组成!首先我们要确定首位置是什么?我们整体看一下所有数;
"123"
"132"
"213"
"231"
"312"
"321"
我们发现当首数字确定了,后面和首数字组成数字的个数相等的!比如: 首数字为1
,后面有组成两个数123
,132
,可以组成2个数.当首数字为2
,3
同样都是.所有我们要找k = 3
的数字 ,我们只需要 3/2
便可找到首数字什么,下面依次类推! Java代码如下:
class Solution { public String getPermutation(int n, int k) { List<Integer> num = new ArrayList<>(); for (int i = 1; i <= n; i++) num.add(i); int[] factorial = new int[n]; factorial[0] = 1; for (int i = 1; i < n; i++) factorial[i] = i * factorial[i-1]; n--; StringBuilder res = new StringBuilder(); while (n >= 0){ int t = factorial[n]; int loc = (int) (Math.ceil((double) k / (double) t)) - 1; if (loc == -1) loc = num.size() - 1; res.append(num.get(loc)); num.remove(loc); k %= t; n--; } return res.toString(); } }
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。