leetcode526. 优美的排列(python实现)

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

第 i 位的数字能被 i 整除
i 能被第 i 位上的数字整除
现在给定一个整数 N,请问可以构造多少个优美的排列?

示例1:

输入: 2
输出: 2
解释:

第 1 个优美的排列是 [1, 2]:
第 1 个位置(i=1)上的数字是1,1能被 i(i=1)整除
第 2 个位置(i=2)上的数字是2,2能被 i(i=2)整除

第 2 个优美的排列是 [2, 1]:
第 1 个位置(i=1)上的数字是2,2能被 i(i=1)整除
第 2 个位置(i=2)上的数字是1,i(i=2)能被 1 整除
说明:

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

class Solution:
    def countArrangement(self, N):
        all = (1 << N) - 1
        an = [0] * all

        def permutation(tmp, k, ans):
            if tmp == all:
                return 1
            if ans[tmp] > 0:
                return ans[tmp]
            score = 0
            for i in range(1, N + 1):
                if (tmp & (1 << (i - 1))) == 0:
                    if (k % i == 0) or (i % k == 0):
                        score += permutation(tmp + (1 << (i - 1)), k + 1, ans)
            ans[tmp] = score
            return score
        score = permutation(0, 1, an)
        return score

python的for是前闭后开的
python的方法里可以嵌套方法
python的数组是array
至于题目本身,没什么要说的

用了一个技巧,当选择的数值比较小时,比如这道题最大是15,要表示选择的数目而不能使用list(因为创建list需要的内存和时间都比较大)
这时候可以用int值来表示选择的哪几个数值,比如选择了1,2,,那就是21+22=6,使用6来表示,用&运算可以判断是否被使用
比如现在的值是180=128+0+32+16+0+4+0,此时和24运算,就可以知道当前数值内事保留4的

你可能感兴趣的:(笔记,leetcode,python,算法)