以下是问题“美丽的布置”(LeetCode 526)和该问题的两段代码。代码1和代码2对我来说看起来相同,但是我不明白为什么代码1比代码2花费更多的时间。有人可以帮我找出原因吗?预先感谢!
问题: 假设您有N个从1到N的整数。如果此数组中的第i个位置(1 <= i <= N)满足以下条件之一,则将美好的排列定义为由这N个数字成功构建的数组:
第i个位置的数字可被i整除。 我可以被第i个位置的数字整除。
现在给定N,您可以构造多少个漂亮的布置?
代码1:
def countArrangement(self, N: int) -> int:
def dfs(cur,N,seen):
if cur==N:
return 1
res = 0
for i in seen:
if (cur+1)%i==0 or i%(cur+1)==0:
res += dfs(cur+1,N,seen-{i})
return res
seen = set(range(1,N+1))
return dfs(0,N,seen)
代码2:
def countArrangement(self, N: int) -> int:
def count(i,X):
if i==1: return 1
return sum(count(i-1,X-{x}) for x in X if i%x==0 or x%i==0)
return count(N,set(range(1,N+1)))