跳到主要内容

526.优美的排列

链接:526.优美的排列
难度:Medium
标签:位运算、数组、动态规划、回溯、状态压缩
简介:现在给定一个整数 N,请问可以构造多少个优美的排列?。

题解 1 - typescript

  • 编辑时间:2021-08-16
  • 执行用时:396ms
  • 内存消耗:43.6MB
  • 编程语言:typescript
  • 解法介绍:深度遍历每个位置。
function countArrangement(n: number): number {
let ans = 0;
dfs();
return ans;
function dfs(list: number[] = [], set = new Set<number>()) {
if (list.length === n) {
ans++;
return;
}
for (let i = 1; i <= n; i++) {
if (!set.has(i) && (i % (list.length + 1) === 0 || (list.length + 1) % i === 0)) {
set.add(i);
list.push(i);
dfs(list, set);
list.pop();
set.delete(i);
}
}
}
}

题解 2 - typescript

  • 编辑时间:2021-08-16
  • 执行用时:148ms
  • 内存消耗:39.3MB
  • 编程语言:typescript
  • 解法介绍:深度遍历每个位置,利用二进制去重。
function countArrangement(n: number): number {
let ans = 0;
dfs();
return ans;
function dfs(list: number[] = [], mask = 0) {
if (list.length === n) {
ans++;
return;
}
for (let i = 1; i <= n; i++) {
if (
(mask & (1 << (i - 1))) === 0 &&
(i % (list.length + 1) === 0 || (list.length + 1) % i === 0)
) {
mask |= 1 << (i - 1);
list.push(i);
dfs(list, mask);
list.pop();
mask &= ~(1 << (i - 1));
}
}
}
}