Leetcode Permutation sequence

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):
“123”
“132”
“213”
“231”
“312”
“321”
Given n and k, return the k th permutation sequence.
Note: Given n will be between 1 and 9 inclusive.

題目鏈接

題目描述
給定n,求從1到n的全排列中第k個全排列。

  1. 模擬全排列的生成過程,循環求第k個。
public String getPermutation(int n, int k) {
        int[] nums = new int[n]; 
        for ( int i=1 ; i<=n; i++ ) 
            nums[i-1] = i ; 
        int index=0;
        for ( int i=1; i<k; i++ ) {
            for ( int j=n-1; j>0; j-- ) {
                if ( nums[j]>nums[j-1] ) {
                    index = j ;
                    break; 
                }
            }

            for ( int j=n-1; j>=0; j-- ) {
                if ( nums[j]>nums[index-1] ) {
                    int temp = nums[j]; 
                    nums[j] = nums[index-1]; 
                    nums[index-1] = temp; 
                    break ; 
                }
            }
            for ( int j=index; j<=(index+n-1)/2; j++ ) {
                int temp = nums[j]; 
                nums[j] = nums[n-1-(j-index)]; 
                nums[n-1-(j-index)] = temp;
            }
        }

        StringBuilder b = new StringBuilder(""); 
        for ( int i=0; i<n; i++ ) {
            b.append(nums[i]); 
        }
        return b.toString();
    }
  1. 從1到n的全排列之中,第k個全排列的每一位可以計算出來。第一個全排列是123…n,對於第i位,其隨後的全排列數是(n-i)!個,當前位置的數字,就是k/(n-i)!,類比進制。
public String getPermutationM2(int n, int k) {
        k--;
        ArrayList<Integer> nums = new ArrayList<>(); 
        for ( int i=1; i<=n; i++ ) nums.add(i);
        int[] f = new int[n]; 
        f[0] = 1; 
        for ( int i=1; i<n; i++ ) f[i] = i*f[i-1];
        StringBuilder b = new StringBuilder("");
        for ( int i=1; i<=n; i++ ) {
            b.append( nums.get(k/f[n-i]) );
            nums.remove(k/f[n-i]);
            k %= f[n-i];
        }
        return b.toString();
    }

歡迎交流指正~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章