题意:
解题思路:
思路:首先我们将所有排列按首位分组:1 + (2, 3, 4的全排列)2 + (1, 3, 4的全排列)3 + (1, 2, 4的全排列)4 + (2, 3, 4的全排列)接下来我们确定第 k=14个排列在哪一组中。每组的排列个数是 3! = 6个,所以第14个排列在第3组中,所以首位已经可以确定,是3。然后我们再将第3组的排列继续分组:31 + (2, 4的全排列)32 + (1, 4的全排列)34 + (1, 2的全排列)接下来我们判断第 k=14个排列在哪个小组中。我们先求第14个排列在第三组中排第几,由于前两组每组有6个排列,所以第14个排列在第3组排第 14−6∗2=2。在第三组中每个小组的排列个数是 2! = 2个,所以第 k 个排列在第1个小组,所以可以确定它的第二位数字是1。31 + (2, 4的全排列) => 3124 3142由于2,4的最大排列为2,所以12 + 2 = 14,所以答案是3142
PHP代码实现:
class Solution {    /**     * @param Integer $n     * @param Integer $k     * @return String     */    function getPermutation($n, $k) {        $fact = 1;        $nums = [];        for ($i = 0; $i < $n; $i++) {            $nums[$i] = $i + 1;            $fact *= $i + 1;        }        $k -= 1;        $res = "";        for ($i = 0; $i < $n; $i++) {            $fact = floor($fact / ($n - $i));            $index = floor($k / $fact);            $res .= (string) $nums[$index];            $k %= $fact;            unset($nums[$index]);            $nums = array_values($nums);        }        return $res;    }}
GO代码实现:
func getPermutation(n int, k int) string {    // offset k    k = k - 1    // build stack of permutations and an array from 1 to n    permStack := []int{}    nums := []int{1}    currentP := 1    for i := 2; i <= n; i++ {        nums = append(nums, i)        permStack = append(permStack, currentP)        currentP = currentP*i    }    // build result    result := ""    for len(nums) > 1 {        // pop from stack        perm := permStack[len(permStack)-1]        permStack = permStack[:len(permStack)-1]        // find index        idx := k/perm        // find next k        k = k%perm        // add num at index to result        result = result + strconv.Itoa(nums[idx])        // delete num at index        copy(nums[idx:], nums[idx+1:])        nums = nums[:len(nums)-1]    }    return result + strconv.Itoa(nums[0])}