60

与46类似,faster than 16%

/**
 * @param {number} n
 * @param {number} k
 * @return {string}
 */
var getPermutation = function(n, k) {
    var nums = new Array(n)
    for(var i = 0; i < n; i++) nums[i] = i + 1
    var v = nums.slice()
    var res = []
    permuteDFS(k, nums, v, '', res)
    return res[k - 1]
};
var permuteDFS = function(k, nums, v, sub, res){
    if(res.length == k) return
    if(sub.length === nums.length){
        if(res.length == k- 1) res.push(sub)
        else res.push(0)
    }else{
        for(var i = 0; i < nums.length; i++){
            if(v[i] === nums[i]){
                v[i] = ''
                sub += nums[i]
                permuteDFS(k, nums, v, sub, res)
                sub = sub.substring(0, sub.length - 1)
                v[i] = nums[i]
            }
        }
    }
}

最高位出现 (n-1)! 次,第一位数字的下标是k/ (n-1)!,将该数字取出,重新对剩下的进行全排列

faster than 100%

/**
 * @param {number} n
 * @param {number} k
 * @return {string}
 */
var getPermutation = function(n, k) {
    let s = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
    var res = ''
    var factorial = [1]
    for (let i = 1; i < n; i++) {
        factorial[i] = factorial[i - 1] * i
    }
    k--
    for(var i = n; i >= 1; i--){
        var j = Math.floor(k/factorial[i - 1])
        k %= factorial[i - 1]
        res += s[j]
        s.splice(j, 1)
    }
    return res
};

你可能感兴趣的:(60)