weekly contest 455。

題目

https://leetcode.com/problems/minimum-increments-to-equalize-leaf-paths/description/

解法

對節點 i 的子節點來說,從根節點 0 到 i 的路徑都是同一條。
有差別的其實是子節點的下段部分,因此從葉節點向上計算路徑和更加方便。


看範例 1,有兩個子節點值分別為 1, 3。
我們只能增加節點值,所以只能把 1 改成 2,需要操作一次。

那如果某節點有超過 2 個節點,例如路徑和 = x, y, z,其中 x <= y <= z 呢?
很簡單,把所有子節點都改成 z。操作次數即非 z 的子節點個數。

時間複雜度 O(N log N)。
空間複雜度 O(N)。

class Solution:
    def minIncrease(self, n: int, edges: List[List[int]], cost: List[int]) -> int:
        g = [[] for _ in range(n)]
        for a, b in edges:
            g[a].append(b)

        ans = 0

        def dfs(i, fa):
            nonlocal ans
            vals = []
            for j in g[i]:
                if j == fa:
                    continue
                vals.append(dfs(j, i))

            # i is leaf
            if not vals:
                return cost[i]

            mx = max(vals)
            mx_cnt = sum(x == mx for x in vals)
            ans += len(vals) - mx_cnt
            return mx + cost[i]

        dfs(0, -1)

        return ans