题目链接
英文链接:https://leetcode.com/problems/beautiful-arrangement/
中文链接:https://leetcode-cn.com/problems/beautiful-arrangement/
题目详述
假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:
第 i 位的数字能被 i 整除
i 能被第 i 位上的数字整除
现在给定一个整数 N,请问可以构造多少个优美的排列?
示例1:
1 | 输入: 2 |
说明:
- N 是一个正整数,并且不会超过15。
题目详解
- 创建一个数组
arr
用来表示从 1 到 N 的数。 - 运用回溯法判断当前排列是否满足要求(实际上回溯的过程就是在生成全排列的过程)。
1 | public class LeetCode_00526 { |
- 同样也是回溯,不过是用访问标志来标志 1 到 N 的数是否被用过。
1 | public class LeetCode_00526 { |
- 动态规划。状态
f[S]
表示用去的数字集合为 S 的方案数,S 的二进制表示中,为 0 的位表示该数字未被使用,为 1 的位表示已经被用过。 - 枚举所有的状态 i,即 [0, (1 << N) - 1]。统计 i 中 1 的个数得到当前代表的数,然后选择一个没有被使用过的数字 j,判断是否满足题目的条件。若满足则更新。
- 初试
f[0] = 1
,最终结果为f[(1 << N) - 1]
,它对应的数字所有二进制位为 1。
1 | public class LeetCode_00526 { |