LeetCode060 Permutation Sequence

来源:互联网 发布:淘宝详情页文案价格 编辑:程序博客网 时间:2024/06/04 18:53

详细见:leetcode.com/problems/permutation-sequence


Java Solution: github

package leetcode;import java.util.Vector;public class P060_PermutationSequence {public static void main(String[] args) {Solution s = new Solution();for (int i = 1; i != 25; i ++)System.out.println(i + "..."+s.getPermutation(4, i));//tools.Utils.printArray(s.cs, 10);//tools.Utils.printArray(s.jiecheng, 10);}/* *2 ms *73.96% */static class Solution {int[] jiecheng = null;int[] cs = null;    public String getPermutation(int n, int k) {    if (n < 1)    return "";    k --;    generateJiecheng(n);    cs = new int[n];    for (int i = 0; i != n; i ++) {    cs[i] = k / jiecheng[n - 1- i];    k = k % jiecheng[n - 1- i];    }    Vector<Integer> v = new Vector<Integer>(n);    for (int i = 0; i != n; i ++)    v.add(i);    char[] temp = new char[n];;    for (int i = 0; i != n; i ++) {    temp[i] = (char)('1' + v.get(cs[i]));    v.remove(cs[i]);    }        return new String(temp);    }    void generateJiecheng(int n) {    jiecheng = new int[n];    jiecheng[0] = 1;    for (int i = 1; i != n; i ++)    jiecheng[i] = i * jiecheng[i - 1];    }}/* * 让代码更加简洁 * 计算逻辑没有任何改变 * 少用了一个长度为N的数组 * 但是更慢了。。。。 * 3 ms * 26.31% */static class Solution2 {int[] jiecheng = null;char[] cs = null;    public String getPermutation(int n, int k) {    if (n < 1)    return "";    k --;    generateJiecheng(n);    cs = new char[n];    Vector<Integer> v = new Vector<Integer>(n);    for (int i = 0; i != n; i ++)    v.add(i);    for (int i = 0; i != n; i ++) {    int v_index = k / jiecheng[n - 1- i];    cs[i] = (char)('1' + v.get(v_index));    k = k % jiecheng[n - 1- i];    v.remove(v_index);    }        return new String(cs);    }    void generateJiecheng(int n) {    jiecheng = new int[n];    jiecheng[0] = 1;    for (int i = 1; i != n; i ++)    jiecheng[i] = i * jiecheng[i - 1];    }}}


C Solution: github

/*    url: leetcode.com/problems/permutation-sequence/    AC 3ms 54.55%*/#include <stdio.h>#include <stdlib.h>char* getPermutation(int n, int k) {    char* ans = (char*) malloc(sizeof(char) * (n+1));    int* h = (int*) malloc(sizeof(int) * n);    int* m = (int*) malloc(sizeof(int) * n);    int ai = 0, ni = 0;    int i = 0, v = 1, cnt = 0, mi = 0;    k --;    for (i = 0; i < n; i ++)        m[i] = 0;    for (i = n-1; i > -1; i --) {        h[i] = v;        v *= (n - i);    }    for (ni = 0; ni < n-1; ni ++) {        cnt = k / h[ni];        mi = 0;        while (cnt > 0) {            while (m[mi] == 1) mi ++;            mi ++;            cnt --;        }        while (m[mi] == 1) mi ++;        ans[ni] = (char) ('1' + mi);         m[mi] = 1;        k = k % h[ni];    }    for (i = 0; i < n; i ++)        if (m[i] == 0) {            ans[n-1] = (char)('1' + i);        }    ans[n] = '\0';    free(h);    free(m);    return ans;}int main() {    int n = 6;    int k = 1;char* ans = NULL;    for (k = 1; k <= 6*5*4*3*2; k ++) {        char* ans = getPermutation(n, k);        printf("k is %d  answer is %s\r\n", k, ans);        free(ans);    }    return 0;}



Python Solution: github

#coding=utf-8'''    url: leetcode.com/problems/permutation-sequence    @author:     zxwtry    @email:      zxwtry@qq.com    @date:       2017年4月12日    @details:    Solution: 75ms 10.83%'''class Solution(object):    def getPermutation(self, n, k):        """        :type n: int        :type k: int        :rtype: str        """        q, m, ti, a, k = [1]*n, [False]*n, 0, [""]*n, k-1        for i in range(n-2, -1, -1):            q[i] = q[i+1] * (n-1-i)        for i in range(n-1):            t, ti = k // q[i], 0            while t > 0:                ti += 1                if m[ti-1]:continue                t -= 1                k -= q[i]            while m[ti]: ti += 1            m[ti] = True            a[i] = str(ti+1)        ti = 0        while m[ti]: ti += 1        a[n-1] = str(ti+1)        return "".join(a)if __name__ == "__main__":    print(Solution().getPermutation(3, 6))                                                    


0 0