张伦聪的技术博客 Research And Development

60. 第k个排列

2018-08-25

给出集合 [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"

解:

class Solution {
    public static String getPermutation(int n, int k) {
        LinkedList<Integer> list = new LinkedList<Integer>();
        for (int i = 1; i <= n; i++) {
            list.add(i);
        }
        return getNextRange(list, k - 1);
    }

    public static String getNextRange(LinkedList<Integer> list, int k) {

        String result = "";
        if (list == null || list.size() == 0) {
            return result;
        }
        //求总的排列数
        int total = 1;
        for (int i = 1; i <= list.size(); i++) {
            total = total * i;
        }
        //每个数字开头有几种排列
        int every = total / list.size();
        //几开头,在list中的索引
        int range = k / every;
        //几开头,的第几个排列
        int other = k % every;

        Integer temp = list.get(range);
        list.remove(list.get(range));
        
        //递归
        result = temp + getNextRange(list, other);
        return result;
    }
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏博主

类似文章

上一篇 29. 两数相除

留言