Leetcode 3593. Minimum Increments to Equalize Leaf Paths

1. 解题思路

这一题思路上就是一个树的遍历。

我们首先构造出这个树,然后根据其所有子节点当中最大的权重构造出各个节点的累积权重。然后,我们考察将其平衡的情况下需要多少次操作,显然,由于操作只能增不能减,因此,我们显然就是考察每一个节点的所有子树上的累计权重,将其他的所有权重都变为最大的那个子树,因此,最大的子树保持不动,然后其他的子树都优先变动父节点将其对齐,然后迭代考察其子树即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minIncrease(self, n: int, edges: List[List[int]], cost: List[int]) -> int:
        graph = defaultdict(list)
        for u, v in edges:
            graph[u].append(v)
            graph[v].append(u)
        
        tree = defaultdict(list)
        def dfs1(u, p):
            nonlocal tree
            for v in graph[u]:
                if v == p:
                    continue
                tree[u].append(v)
                dfs1(v, u)
            return
        dfs1(0, -1)

        weights = deepcopy(cost)
        def dfs2(u):
            nonlocal weights
            w = 0
            for v in tree[u]:
                w = max(w, dfs2(v))
            weights[u] += w
            return weights[u]
        dfs2(0)

        def dfs3(u):
            if len(tree[u]) == 0:
                return 0
            w = max(weights[v] for v in tree[u])
            ans = 0
            for v in tree[u]:
                ans += dfs3(v) if weights[v] == w else 1 + dfs3(v)
            return ans

        return dfs3(0)

提交代码评测得到:耗时791ms,占用内存88.46MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值