【Leetcode】2049-1912

前言

优秀的题目,幽默的我


思路

首先可以明确的是,每个节点的分数就是其所有的子树中个数的乘积再与其父节点之前的所有节点个数相乘。

而节点的每个子树中节点的个数是十分好计算的,关键在于其父节点及之前,可以在计算每个节点的时候dfs进去下一个节点,与此同时传入出去下一个节点所在子树的节点个数

class Solution:
    def countHighestScoreNodes(self, parents: List[int]) -> int:
        n = len(parents)
        g = [[] for _ in range(n)]
        for i in range(1, n):
            g[parents[i]].append(i)
        had = [0] * n

        def dfs(u, fa):
            had[u] = sum(dfs(v, u) for v in g[u] if v != fa) + 1
            return had[u]

        dfs(0, -1)
        ans = 0
        num = 0

        def cal(u, fa, cur):
            temp = cur + 1
            c = cur if cur != 0 else 1
            for v in g[u]:
                if v == fa: continue
                temp += had[v]
                c *= had[v]
            nonlocal ans, num
            if c == ans:
                num += 1
            elif c > ans:
                ans = c
                num = 1
            for v in g[u]:
                if v == fa: continue
                cal(v, u, temp - had[v])

        cal(0, -1, 0)
        return num

写完这个代码,我就发现我自己幽默的很,对于这个其父节点之前的所有节点个数,那不就是减去所有子节点所在子树的节点个数再减去本身吗?
幽默的我

class Solution:
    def countHighestScoreNodes(self, parents: List[int]) -> int:
        n = len(parents)
        g = [[] for _ in range(n)]
        for i in range(1, n):
            g[parents[i]].append(i)
        ans = 0
        num = 0
        def dfs(u):
            c = 1
            t = 0
            for v in g[u]:
                temp = dfs(v)
                c *= temp # 统计结果
                t += temp # 统计节点个数
            if n-1!=t:
                c*= (n-1-t)
            nonlocal ans, num
            if c == ans:
                num += 1
            elif c > ans:
                ans = c
                num = 1
            return t + 1
        dfs(0)
        return num

posted @ 2024-07-28 23:43  TICSMC  阅读(7)  评论(0)    收藏  举报