力扣(LeetCode)- 60. 排列序列

题目:

给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,返回第 k 个排列。

示例 1:

复制代码
输入:n = 3, k = 3
输出:"213"

解答:javascript

javascript 复制代码
let result = ''
let count = 0
var getPermutation = function(n, k) {
    // 这里需要重置下值,不然多个用例运行会出错
    result = ''
    count = 0
    
    const line = []
    const arr = new Array(n).fill(null).map((v, i) => i + 1)
    dp(arr, line, k)
    return result
};

const dp = (arr, line, k) => {
    if (result) {
        return
    }
    if (arr.length === 0) {
        count++
        if (count === k) {
            result = line.join("")
        }
        return
    }
    for (let i = 0;i < arr.length;i++) {
        let len = arr.length - 1;
        // 用阶乘计算有几种情况,如果这些情况总数未达到 k,
        // 那么情况数相加, 不走后面排序节约内存
        if (len > 1) {
            let cnt = 1
            while(len > 1) {
                cnt *= len
                len--
            }
            
            if (cnt + count < k) {
                count += cnt
                continue
            }
        }
        line.push(arr[i])
        const newArr = arr.filter((v, j) => i !== j)
        dp(newArr, line, k)
        // 回溯
        line.pop()
    }
}
相关推荐
im_AMBER1 小时前
Leetcode 70 好数对的数目 | 与对应负数同时存在的最大正整数
数据结构·笔记·学习·算法·leetcode
小妖6661 小时前
力扣(LeetCode)- 74. 搜索二维矩阵
算法·leetcode·矩阵
Liangwei Lin1 小时前
洛谷 U311289 矩阵距离
线性代数·算法·矩阵
Dev7z4 小时前
基于MATLAB数学形态学的边缘检测算法仿真实现
算法·计算机视觉·matlab
风筝在晴天搁浅11 小时前
代码随想录 718.最长重复子数组
算法
kyle~11 小时前
算法---回溯算法
算法
star _chen11 小时前
C++实现完美洗牌算法
开发语言·c++·算法
hzxxxxxxx11 小时前
1234567
算法
Sylvia-girl12 小时前
数据结构之复杂度
数据结构·算法