组合相关问题

109 阅读1分钟

题目:求1-n数子组合的n!有序排列中,第k个组合【leetcode 60】

题目描述

给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,给出第k个排列的组合

运行效率

1650811928(1).png

大致思路

  • 根据n-1位可以组合的数,来计算n位置的数字。
    • i*dp[n-1]即,n位置如果是i,可以组合成多少排列。
    • 如果i*dp[n-1]<k,说明n位置取值i,k = k % dp[select - 1]来计算出来用剩余的数字需要排列出来的第k个元素
    • 如果i*dp[n-1]<k,说明找到结果了,就是n的最大排列
  • 如此一次找下去,依次找到最后一位

代码如下

function getPermutation(n: number, k: number): string {
  let dp = [1];
  let res = [0];

  for (let i = 1; i <= n; i++) {
    dp[i] = dp[i - 1] * i;
    res[i] = i;
  }

  let select = n;

  while (select > 1) {
    for (let i = 1; i <= select; i++) {
      if (k <= dp[select - 1] * i) {
        res[0] = res[i];
        for (let j = i; j < select; j++) {
          res[j] = res[j + 1];
        }
        res[select] = res[0];
        if (k === dp[select - 1] * i) {
          return getRes();
        }
        k = k % dp[select - 1];

        break;
      } else {
        continue;
      }
    }
    select--;
  }
  return getRes();

  function getRes() {
    res.shift();
    return res.reverse().join("");
  }
}

const res = getPermutation(4, 9);

debugger;