Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

60. 排列序列 #68

Open
buuing opened this issue Feb 14, 2022 · 0 comments
Open

60. 排列序列 #68

buuing opened this issue Feb 14, 2022 · 0 comments

Comments

@buuing
Copy link
Owner

buuing commented Feb 14, 2022

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

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

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "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!

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。




  • 数学规律求解
const getPermutation = (n, k) => {
  const nums = new Array(n).fill().map((_, i) => i + 1)
  const totalArr = [0, 1]
  for (let i = 2; i <= n; i++) {
    totalArr[i] = totalArr[i - 1] * i
  }
  let total = totalArr[n], res = ''
  while (nums.length) {
    const index = Math.ceil(k / total * n) - 1
    const num = nums.splice(index, 1)[0]
    res += num
    k = k % (total / n) || (total / n)
    total = totalArr[--n]
  }
  return res
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant