力扣(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()
    }
}
相关推荐
灵感__idea4 小时前
Hello 算法:贪心的世界
前端·javascript·算法
ZK_H5 小时前
嵌入式c语言——关键字其6
c语言·开发语言·计算机网络·面试·职场和发展
澈2075 小时前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
ambition202425 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_5 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
qiqsevenqiqiqiqi5 小时前
前缀和差分
算法·图论
代码旅人ing5 小时前
链表算法刷题指南
数据结构·算法·链表
Yungoal5 小时前
常见 时间复杂度计算
c++·算法
6Hzlia6 小时前
【Hot 100 刷题计划】 LeetCode 48. 旋转图像 | C++ 矩阵变换题解
c++·leetcode·矩阵
不爱吃炸鸡柳7 小时前
单链表专题(完整代码版)
数据结构·算法·链表