"""
给出一个含有不重复整数元素的数组 arr ,每个整数 arr[i] 均大于 1。
用这些整数来构建二叉树,每个整数可以使用任意次数。
其中:每个非叶结点的值应等于它的两个子结点的值的乘积。
满足条件的二叉树一共有多少个?答案可能很大,返回 对 10^9 + 7 取余 的结果。
"""
from typing import List
class Solution:
def numFactoredBinaryTrees(self, arr: List[int]) -> int:
arr.sort()
n = len(arr)
dp = [1] * n
# dp[i] 表示以arr[i]为根节点的二叉树的个数,默认为1表示只有根节点
# for 循环中的两个for循环,第一个for循环是遍历所有的节点
# 第二个for循环是遍历所有的节点的左子节点
for i in range(1, n):
for j in range(i):
if arr[i] % arr[j] == 0:
k = arr[i] // arr[j]
# 如果k在arr中,说明arr[i]的左子节点arr[j]和右子节点k都在arr中
if k in arr:
# 以arr[i]为根节点的二叉树的个数 += 以arr[j]为根节点的二叉树的个数 * 以k为根节点的二叉树的个数
dp[i] += dp[j] * dp[arr.index(k)]
ret = 0
for i in dp:
ret += i
return ret % (10 ** 9 + 7)
我分享的LeetCode刷题记录内容仅供参考和学习使用,不构成任何形式的权威建议。如果出现任何错误或疏漏,希望大家友好讨论和指正。