算法<Permutation Sequence>

问题描述:给定1-n个整数,将这N个数字做全排列,求第K个排列,结果用String形式返回。

分析:
对于{1,2,3,4}的全排列来说,可以是:
1+{2,3,4}的全排列;
2+{1,3,4}的全排列;
3+{1,2,4}的全排列;
4+{1,2,3}的全排列;

假如我们要求第十五个全排列,那么我们的流程应该是

k=15-1

i=1;
14/3!=2=>数组{1,2,3,4}中第三个数字是3,将数组中的3除去,此时数组为{1,2,4};
更新K=14-2*3!=2;

k=2

i=2;
2/2!=1=>数组{1,2,4}中的第二个数字是2,将3从数组中得到新的数组{14}

….

最后可以得到结果:3214

思路已经理清楚,接下来就是代码的实现了:

import java.util.ArrayList;
import java.util.List;

/**
 * 给定一个n,在从1-n的数字的 全排列中找到第k个全排列
 *
 * @version 2017/7/21.21:33
 */
public class K_th_Permutation {
    public static void main(String[] args) {
        System.out.println(new K_th_Permutation().getPermutation(4, 15));
    }

    public String getPermutation(int n, int k) {
        List<Integer> list = new ArrayList<>();
        int[] factorial = new int[n + 1];
        StringBuilder builder = new StringBuilder();
        // create an array of factorial lookup
        //求n的阶乘
        int sum = 1;
        factorial[0] = 1;
        for (int i = 1; i <= n; i++) {
            sum *= i;
            factorial[i] = sum;
        }
        // factorial[] = {1, 1, 2, 6, 24, ... n!}
        // create a list of list to get indices
        for (int i = 1; i <= n; i++)
            list.add(i);
        // list = {1, 2, 3, 4}
        k--;
        for (int i = 1; i <= n; i++) {
            int index = k / factorial[n - i];
            builder.append(String.valueOf(list.get(index)));
            list.remove(index);
            k -= index * factorial[n - i];
        }
        return String.valueOf(builder);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值