LeetCode刷题日记(823. 带因子的二叉树)

"""
给出一个含有不重复整数元素的数组 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刷题记录内容仅供参考和学习使用,不构成任何形式的权威建议。如果出现任何错误或疏漏,希望大家友好讨论和指正。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值