526.优美的排列
题目描述
假设有从1到N的N个整数,如果从这N个数字中成功构造出一个数组,使得数组的第i位(1<=i<=N)满足如下两个条件中的一个,就称这个数组为一个又没得排列。条件:
- 第i位的数字能被i整除。
- i能被第i位上的数字整除
现给定一个整数N,请问可以构造多少个优美排列?
示例
输入:2
输出:2
解释:
第1个优美的排列是[1, 2]:
- 第1个位置(i=1)上的数字是1,1能被i整除
- 第2个位置(i=2)上的数字是2,2能被i整除
第2个优美的排列是[2, 1]: - 第1个位置(i=1)上的数字是2,2能被i整除
- 第2个位置(i=2)上的数字是1,i能被1整除
说明
- N是一个正整数,并且不会超过15
思路:回溯
回溯
使用回溯法从左至右一次向目标排列中放入数。定义backtrack(index)方法,用于尝试向index位置放入数。在countArrangement()方法中,找到一个符合条件且未被使用过的数,递归执行backtrack(index+1),当该方法执行结束,回溯到当前层,尝试使用下一个符合条件的未被使用过的数继续递归。
回溯过程中,可以对使用过的数进行标记,回溯结束后,将标记初始化。
Python代码
class Solution:
def countArrangement(self, n: int) -> int:
# 回溯
self.ans = 0
flag = [False] * (n+1)
def backtrack(index):
if index == n+1:
self.ans += 1
for i in range(1, n+1):
if not flag[i] and (i%index == 0 or index%i == 0):
flag[i] = True
backtrack(index+1)
flag[i] = False
backtrack(1)
return self.ans