力扣每日一题2021.08.16优美的排列


526.优美的排列

题目描述

假设有从1到N的N个整数,如果从这N个数字中成功构造出一个数组,使得数组的第i位(1<=i<=N)满足如下两个条件中的一个,就称这个数组为一个又没得排列。条件:

  1. 第i位的数字能被i整除。
  2. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值