每日一题 823. 带因子的二叉树

每日一题 823. 带因子的二叉树 难度:中等
在这里插入图片描述
思路:

  1. 取乘积,那么两个叶子节点相乘一定会得到一个更大的数,所以先排序
  2. 以父节点为根节点的数的数量 = 以右节点为根节点的数的数量 * 以左节点为根节点的数的数量
  3. 初始化列表,每个数作为根节点都至少能以它本身构建一棵树,所以每个数的初始对应数量为 1,这里为了快速查找,定义字典来实现
  4. 从小到大遍历排好序的数组,寻找能构成 右子 * 左子 = 当前数 的组合,并更新当前数所对应的组合数
  5. 返回字典中所有值的和

代码如下:

class Solution:
    def numFactoredBinaryTrees(self, arr: List[int]) -> int:
        arr.sort()
        t = {}
        for i in range(len(arr)):
            t[arr[i]] = 1
        for i in range(len(arr)):
            for j in range(0, i):
                if arr[i] % arr[j] == 0 and arr[i]/arr[j] in t:
                    t[arr[i]] = (t[arr[i]] + t[arr[j]] * t[arr[i]/arr[j]]) % (10 ** 9 + 7)
        return sum(t.values()) % (10 ** 9 + 7)

但我不知道为什么下面的代码能更快实现,感觉差不多
学习:快速构建含有初值的字典 r = { x: 1 for x in arr}

class Solution: 
    def numFactoredBinaryTrees(self, arr: List[int]) -> int:
        arr.sort()
        r = { x: 1 for x in arr}
        for x in arr:
            a = sqrt(x)
            if a in r:
                r[x] += r[a] ** 2
            for j in range(bisect.bisect_left(arr, a)):
                if not x % arr[j] and x / arr[j] in r:
                    r[x] += r[arr[j]] * r[x / arr[j]] * 2
        return sum(r.values()) % 1000000007
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eyvr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值