lintcode 990.美丽的排列 回溯

假设你有 N 个从 1 到 N 的整数。我们将一个美丽的排列定义为:如果一个数组由这给出的 N个整数构成,且满足下列任意一个条件对此数组中的第i个位置(1 <= i <= N)的要求,则这个数组为美丽的排列:

  1. 第 i 个 位置的元素可以被 i 整除。
  2. i 可以被第 i 个元素整除。
    现在给出 N,你可以构造出多少美丽的排列?

 

N 是一个正整数并且不会超过 15

您在真实的面试中是否遇到过这个题?  是

题目纠错

样例

样例1

输入: 2
输出: 2
解释: 

第一个美丽的排列是[1, 2]:

第 1 个位置(i = 1)的数字为 1,1 可以被i(i = 1)整除。

第 2 个位置(i = 2)的数字为 2,2 可以被i(i = 2)整除。

第一个美丽的排列是[2, 1]:

第 1 个位置(i = 2)的数字为 2,2 可以被i(i = 1)整除。

第 2 个位置(i = 2)的数字为 1,i(i = 2)可以被 1 整除。

样例2

输入:3
输出:3

 

 

class Solution:
    """
    @param N: The number of integers
    @return: The number of beautiful arrangements you can construct
    """
    N = 0

    def t(self, deep, s):
        if deep > self.N:
            return 1
        total = 0
        for i in s:
            if i % deep == 0 or deep % i == 0:
                s.remove(i)
                total += self.t(deep + 1, s)
                s.add(i)
        return total

    def countArrangement(self, N):
        s = set(range(1, N + 1))
        self.N = N
        return self.t(1, s)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值