1、题目描述:
2、思路及代码:
2.1 方法一:回溯法(超时)
(1)思路:
本质就是写一个全排列,然后每次生成一个全排列之后,再判断这个排列是不是最优的。
那么全排列怎么写呢?这里我使用回溯法,也就是利用递归:
(1)每次固定住前position位,让之后的进行交换,比如:[1,2,3],固定第0位,也就是1,让2和3交换,结果就是1,2,3和1,3,2。然后固定第1位,也就是2,让1和3交换,结果就是2,1,3和2,3,1。最后固定第2位,也就是,让1和2交换,结果就是3,2,1和3,1,2。
(2)以上都是position=0的情况,那么要让position遍历完,需要使用递归的调用,也就是每次让position++(减小规模)。
(3)每次把一种排列生成之后,我们需要把nums回复成原始状态,为下一次排列做准备。比如:我们把1,x,x的情况考虑完了之后,我们需要考虑2,x,x的情况,这个时候,我们需要把数组恢复成原始状态1,2,3。
结束条件是:position到达数组的最大长度。
(2)代码:
class Solution:
def countArrangement(self, n: int) -> int:
res = 0 # 保存结果
nums = [i for i in range(1, n+1)]
def judge(nums):
for index in range(len(nums)):
if (index+1) % nums[index] != 0 and nums[index] % (index+1