每天一道leetcode(Day 56)


60. 第 k 个排列

题目描述

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

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

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

说明:

  • 给定 n 的范围是 [1, 9]。
  • 给定 k 的范围是[1, n!]。

示例

  • 示例 1:
输入: n = 3, k = 3
输出: "213"
  • 示例 2:
输入: n = 4, k = 9
输出: "2314"

解题思路

回溯法,套用模板即可。

求出给定 n 的全排列,然后返回第 k 个排列即可。

类似题目:
39. 组合总和
47. 全排列 II

代码

/**
 * @param {number} n
 * @param {number} k
 * @return {string}
 */
var getPermutation = function (n, k) {
  let res = [],
    path = [];
  function back_track(path) {
    if (path.length === n) {
      res.push(path.slice());
    }
    if (res.length === k) return;
    for (let i = 1; i <= n; i++) {
      if (path.includes(i)) continue;
      path.push(i);
      back_track(path);
      path.pop();
    }
  }
  back_track(path);
  return res[k - 1].join("");
};

参考

60. 第 k 个排列


文章作者: CassielLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 CassielLee !
评论
  目录