LeetCode - Permutation Sequence

来源:互联网 发布:黑米软件怎么样 编辑:程序博客网 时间:2024/06/04 19:59

这道题思路并不难,就是n个数有n!中排列,那么每一位都可以通过k对剩余位数的阶乘取余来获得。

在k--那个地方调试了好久。。。。

    public String getPermutation(int n, int k) {        if(n<=0) return "";        if(n==1) return "1";        k--;        int fac = 1;        int i = n-1;        while(i>1){            fac*=i;            i--;        }        ArrayList<Integer> num = new ArrayList<Integer>();        for(i=1; i<=n; i++){            num.add(i);        }                StringBuilder rst = new StringBuilder();        i=n-1;        while(i>=0){            int index = k/fac;            rst.append(num.get(index));            num.remove(index);            k = k%fac;            if(i!=0) fac /= i;            i--;        }        return rst.toString();    }

因为每一轮要remove一个数,在array里面remove一个数是O(n),所以总的时间是O(n^2)

在k--那个地方想了好久,应该是 (k-1)/fac 还是 k/fac-1呢。。。

这个问题是:每个set包含n个数,set下标从0开始,那么第k个数在第几个set呢?

set 0 :  n个数

set 1 : n个数

。。。。。

对于 k = x * n(x为整数)来说,其实应该在x-1组里面,而对于 k = x*n+b (b<n)来说,应该在第x组里面,但这两个k值除以n都为x,所以不对。

而k--就解决了这个问题。 

0 0
原创粉丝点击