目标
给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数。如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列:
- 对于 0 <= i < n - 1 的下标 i ,要么 nums[i] % nums[i+1] == 0 ,要么 nums[i+1] % nums[i] == 0 。
请你返回特别排列的总数目,由于答案可能很大,请将它对 109 + 7 取余 后返回。
示例 1:
输入:nums = [2,3,6]
输出:2
解释:[3,6,2] 和 [2,6,3] 是 nums 两个特别的排列。
示例 2:
输入:nums = [1,4,3]
输出:2
解释:[3,1,4] 和 [4,1,3] 是 nums 两个特别的排列。
说明:
- 2 <= nums.length <= 14
- 1 <= nums[i] <= 10^9
思路
有一个互不相同的正整数数组,问使得相邻元素可以被整除(对于相邻元素a % b == 0 || b % a == 0
)的排列有多少种。
排列数的计算需要使用dfs,但如果不保存重复子问题的话会超时。
难点在于是否将保存的结果计入,例如 [2,6,3]
,虽然dfs 2 -> 6 -> 3
与 6 -> 2 -> 3
有重复的子问题3,但是后者不符合题目条件。
// todo
代码