LeetCode-------60. Permutation Sequence(n的全排列中第K列)

本文介绍了一种高效算法来解决求解1到n的数字构成的所有不同排列中的第k个排列的问题。通过数学解析的方法避免了全排列的计算,大大降低了算法复杂度。

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.

Subscribe to see which companies asked this question

思路一:求出全排列,回溯法;然后找出第k个(算法复杂度过高-----N!)

思路二:数学解析

已知n的值,学过排列组合知道共有n!种排列。

 
第一位每个数字开头的序列都有(n-1)!个序列,因此n个数字所以共有n!个序列。
 
以此类推,第二位每一个数开头都有(n-2)!个序列。
 
因为数字不能重复,我用sign记录数字是否使用过,data存阶层的值。
 
每次循环找到没使用过的数中第k/data[i]个数就是当前位的数字。

设变量K1 = K
a1 = K1 / (n-1)!// 第一位的选择下标

同理,a2的值可以推导为

K2 = K1 % (n-1)!
a2 = K2 / (n-2)!

。。。。。

K(n-1) = K(n-2) /2!
a(n-1) = K(n-1) / 1!

an = K(n-1)

public class Solution {

    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、付费专栏及课程。

余额充值