LeetCode:第k个排列

第k个排列

题目叙述:

给出集合 [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=1的时候会有1种情况,n=2会有2种情况,n=3会有6种情况,n=n会有(n!)种情况。当我们选择第k个序列的时候相当于我们的首位可以是第k/(n-1)!个数,依次第二位将是k%(n-1)!/(n-2)!个数······等等,因此我们将1~n用一个List集合存储起来,取出一个数后将其在List移出。直到List移空。时间复杂度为O(n)。

代码实现:
class Solution {
    public String getPermutation(int n, int k) {
        int[] nums = new int[n];
        List<Integer> help = new ArrayList();
        StringBuffer res=new StringBuffer();
        int num = 1;
        for (int i = 1; i < n+1; i++) {
            num *= i;
            nums[i - 1] = num;
            help.add(i);
        }
        k--;
        for (int i = n - 2; i > -1; i--) {
            res.append(help.get(k/nums[i]));
            help.remove(help.get(k/nums[i]));
            k%=nums[i];
        }
        res.append(help.get(0));
        return res.toString();
    }
}
    原文作者:一萍之春
    原文地址: https://www.jianshu.com/p/0b90bee4d462
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞