【LeetCode】60. 排列序列

SoftwareDevOps 斗灵
优质创作者: 编程框架技术领域
领域专家: 后端开发技术领域
2022-09-08 11:38:42

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

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

"123"
"132"
"213"
"231"
"312"
"321"
给定 n 和 k,返回第 k 个排列。

 

示例 1:

输入:n = 3, k = 3
输出:"213"


示例 2:

输入:n = 4, k = 9
输出:"2314"


示例 3:

输入:n = 3, k = 1
输出:"123"

 

提示:

  • 1 <= n <= 9
  • 1 <= k <= n!

 

假设现在有集合[1,2,3,...,n],我们先来考虑第一种情况:当首个排列字符为“1”的时候,那么第二个字符只能从[2,3,...,n]中选,不能再次为“1”。如果第二个排列字符为“2”,那么第三个字符只能从[3,...,n]中选,不能再次为“1”或者“2”。

所以,我们只需要在循环的时候,将删除了当前需要排列的字符的集合作为新的集合传递给下次循环。当集合中只剩下最后一个字符时,说明这是当前排列方式的最后一个字符,那么递归结束,将当前排列方式的整体字符串放置到一个数组中,根据所传参数 k 返回对应 index 的字符串。

var getPermutation = function(n, k) {
    let arr =[]
    let res=[]
    for(let i = 1;i<=n;++i){
        arr.push(i+"") // [1,2,3,...,n]
    }
    useList("",arr,res)
    return res[k-1] || -1
};

function useList(parent,data,res){
  for(let index =0;index<data.length;++index){
    // 获取当前排列的字符
    const val = data[index]
    // 将当前排列字符添加到当前排列方式字符串中,如:“123”
    const child = parent+val
    if(data.length>1){
      // 复制集合
      const box = [...data]
      // 删除已排列的字符
      box.splice(index,1)
      // 递归
      useList(child,box,res)
    }else{
      // 递归完成后将字符串放进结果数组中
      res.push(child)
    }  
  }
}

 

...全文
61 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

126

社区成员

发帖
与我相关
我的任务
社区描述
想刷题,往往三天打鱼两天晒网,没有毅力坚持下去的人。可以跟着此专栏,一天一道题,坚持就是胜利!
后端云原生前端框架 个人社区 江苏省·苏州市
社区管理员
  • SoftwareDevOps
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

“1024 程序员节|用代码,改变世界” 主题征文开启,限定勋章&丰富周边大奖等你拿!快来投稿吧~

https://bbs.csdn.net/topics/608723542

在本页面下,评论:我要报名。

 

即可参赛成功!1022~1024期间发文还能获取1024勋章!快来参与吧!第一次组织,希望各位大佬多多支持呐!

试试用AI创作助手写篇文章吧