[LeetCode]--60. Permutation Sequence

本文介绍了一种高效算法来解决求解第K个排列序列的问题,并提供了两种不同的实现方式,一种通过直接生成所有可能的排列,另一种则利用数学原理进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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):

1."123"
2."132"
3."213"
4."231"
5."312"
6."321"

Given n and k, return the kth permutation sequence.

Note: Given n will be between 1 and 9 inclusive.

[LeetCode]–46. Permutations

前面做过很多个这样类似题,所以很快就能想到找下一个字串。

public String getPermutation(int n, int k) {
        if (n == 1)
            return "1";
        int[] nums = new int[n];
        for (int i = 0; i < n; i++)
            nums[i] = i + 1;
        for (int i = 1; i < k; i++) {
            nums = getNextPermutation(nums);
        }
        String str = "";
        for (int i = 0; i < nums.length; i++) {
            str += nums[i];
        }
        return str;
    }

    public int[] getNextPermutation(int[] nums) {
        int i = nums.length - 1;
        while (i > 0 && nums[i] < nums[i - 1])
            i--;
        int second = Integer.MAX_VALUE, secondIndex = Integer.MAX_VALUE;
        for (int j = nums.length - 1; j >= i; j--)
            if (nums[j] > nums[i - 1] && nums[j] < second) {
                second = nums[j];
                secondIndex = j;
            }
        int temp = nums[i - 1];
        nums[i - 1] = nums[secondIndex];
        nums[secondIndex] = temp;
        Arrays.sort(nums, i, nums.length);
        return nums;
    }

虽然AC了,不过效率实在是很低,我又找到了一个效率很高的,beat88%的算法。

public String getPermutation(int n, int k) {
        StringBuilder sb = new StringBuilder();
        boolean[] used = new boolean[n];

        k = k - 1;
        int factor = 1;
        for (int i = 1; i < n; i++) {
            factor *= i;
        }

        for (int i = 0; i < n; i++) {
            int index = k / factor;
            k = k % factor;
            for (int j = 0; j < n; j++) {
                if (used[j] == false) {
                    if (index == 0) {
                        used[j] = true;
                        sb.append((char) ('0' + j + 1));
                        break;
                    } else {
                        index--;
                    }
                }
            }
            if (i < n - 1) {
                factor = factor / (n - 1 - i);
            }
        }

        return sb.toString();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值