力扣(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()
    }
}
相关推荐
fufu03119 分钟前
Linux环境下的C语言编程(四十八)
数据结构·算法·排序算法
Yingye Zhu(HPXXZYY)29 分钟前
Solution to Luogu P6340
算法
小熳芋1 小时前
单词搜索- python-dfs&剪枝
算法·深度优先·剪枝
Xの哲學1 小时前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算
bu_shuo1 小时前
MATLAB中的转置操作及其必要性
开发语言·算法·matlab
高洁011 小时前
图神经网络初探(2)
人工智能·深度学习·算法·机器学习·transformer
爱装代码的小瓶子2 小时前
算法【c++】二叉树搜索树转换成排序双向链表
c++·算法·链表
思成Codes2 小时前
数据结构:基础线段树——线段树系列(提供模板)
数据结构·算法
a努力。2 小时前
字节Java面试被问:系统限流的实现方式
java·开发语言·后端·面试·职场和发展·golang
虾..3 小时前
Linux 简单日志程序
linux·运维·算法