2

力扣每日一题——统计最高分的节点数目

 2 years ago
source link: https://unique-pure.github.io/2022/03/11/suan-fa-xue-xi-ji-hua/mei-ri-yi-ti/20220311/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

1 题目描述

给你一棵根节点为 0二叉树 ,它总共有 n 个节点,节点编号为 0n - 1 。同时给你一个下标从 0 开始的整数数组 parents 表示这棵树,其中 parents[i] 是节点 i 的父节点。由于节点 0 是根,所以 parents[0] == -1

一个子树的 大小 为这个子树内节点的数目。每个节点都有一个与之关联的 分数 。求出某个节点分数的方法是,将这个节点和与它相连的边全部 删除 ,剩余部分是若干个 非空 子树,这个节点的 分数 为所有这些子树 大小的乘积

请你返回有 最高得分 节点的 数目

  • n == parents.length
  • 2 <= n <= 10^5
  • parents[0] == -1
  • 对于 i != 0 ,有 0 <= parents[i] <= n - 1
  • parents 表示一棵二叉树。

example-1

输入:parents = [-1,2,0,2,0]
输出:3
解释:
- 节点 0 的分数为:3 * 1 = 3
- 节点 1 的分数为:4 = 4
- 节点 2 的分数为:1 * 1 * 2 = 2
- 节点 3 的分数为:4 = 4
- 节点 4 的分数为:4 = 4
最高得分为 4 ,有三个节点得分为 4 (分别是节点 1,3 和 4 )。

3 构图+dfs O(n)

如果直接使用parents数组,我们很难处理,因为我们不知道每个节点的孩子,这对我们正常的遍历思想不一致,所以我们需要转化一下,将parents转换为邻接表,这样我们就可以从根一直遍历到叶子节点。

由于需要求最高分的节点数目,我们需要解决以下问题:

  • 如何求单个节点的最高分?

    dfs求出每颗子树的大小,相乘即可。注意除根节点之外,其他节点是无法遍历得到所有子树大小的,因为不能往上走,但是我们通过总节点数和其他子树的总数就可以得到了。

  • 如何统计最高分的节点数目?

    在求解完分数后,及时更新判断即可。

class Solution {
private:
    int len;
    vector<vector<int>> children;
    int res;
    long long maxScore;
public:
    long long dfs(int node) {
        long long score = 1;
        long long size = this->len - 1;
        for (auto p : children[node]) {
            long long ans = dfs(p);
            score *= ans;
            size -= ans; 
        }
        // 注意只有子节点能全访问完父节点,所以未访问得都要乘。
        if (node != 0) {
            score *= size;
        }
        if (score == this->maxScore) {
            this->res ++;
        } else if (score > this->maxScore) {
            this->res = 1;
            this->maxScore = score;
        }
        return this->len - size;
    }
    int countHighestScoreNodes(vector<int>& parents) {
        this->len = parents.size();
        this->res = 1;
        this->maxScore = 0;
        this->children = vector<vector<int>>(this->len);
        // 建图
        for (int i = 1; i < this->len; ++ i ) {
            this->children[parents[i]].push_back(i);
        }
        dfs(0);
        return this->res;
    }
};

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK