Leetcode60. Permutation Sequence

这题和剑指上的Permutation其实是一道题。
按顺序输出第k个排序即可。
而给了n和k,这个排序其实已经确定了,如给定n=4,k=9:
k-=1 -> k=8(因为从0开始)
8/3! = 1
8%3! = 2
2/2! = 1
2%2! =0
即1234先变成2134,134在变成213即最终输出2314 。
这里需要注意,这里的顺序和剑指不太一样,剑指因为没有要求输出顺序,所以直接swap即可,而这里的swap交换后也要是有序的。

class Solution {
    public String getPermutation(int n, int k) {
        if(n==1) return "1";
        k=k-1;
        char[] ans = new char[n];
        for(int i=0;i<n;i++) ans[i] = (char)(i+'1');
        int index = 0;
        int delta = 0;
        int factor = factorial(n-1);
        while(k!=0){
            delta = k/factor;
            swap(ans,index,index+delta);
            k = k%factor;
            factor/=(n-1-index);
            index++;
        }
        return new String(ans);
    }
    private int factorial(int a){
        if(a==1) return 1;
        return a*factorial(a-1);
    }
    private void swap(char[] chars,int a,int b){
        if(a==b) return;
        char temp = chars[b];
        for(int i=b;i>a;i--) chars[i]=chars[i-1];
        chars[a]=temp;
    }
}

Runtime: 5 ms, faster than 100.00% of Java online submissions for Permutation Sequence.
Memory Usage: 37.4 MB, less than 43.90% of Java online submissions for Permutation Sequence.

posted @ 2019-03-23 16:36  大胖子球花  阅读(79)  评论(0)    收藏  举报