2049:统计最高分的节点数目

This commit is contained in:
轩辕龙儿 2022-03-11 12:06:16 +08:00
parent 1d45b6e7d6
commit 52fa888069
2 changed files with 170 additions and 0 deletions

View File

@ -0,0 +1,122 @@
//给你一棵根节点为 0 二叉树 它总共有 n 个节点节点编号为 0 n - 1 同时给你一个下标从 0 开始的整数数组 parents 表示这棵
//其中 parents[i] 是节点 i 的父节点由于节点 0 是根所以 parents[0] == -1
//
// 一个子树的 大小 为这个子树内节点的数目每个节点都有一个与之关联的 分数 求出某个节点分数的方法是将这个节点和与它相连的边全部 删除 剩余部分是若
//干个 非空 子树这个节点的 分数 为所有这些子树 大小的乘积
//
// 请你返回有 最高得分 节点的 数目
//
//
//
// 示例 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 分别是节点 13 4
//
//
// 示例 2
//
//
//
// 输入parents = [-1,2,0]
//输出2
//解释
//- 节点 0 的分数为2 = 2
//- 节点 1 的分数为2 = 2
//- 节点 2 的分数为1 * 1 = 1
//最高分数为 2 有两个节点分数为 2 分别为节点 0 1
//
//
//
//
// 提示
//
//
// n == parents.length
// 2 <= n <= 10
// parents[0] == -1
// 对于 i != 0 0 <= parents[i] <= n - 1
// parents 表示一棵二叉树
//
// Related Topics 深度优先搜索 数组 二叉树 👍 53 👎 0
package leetcode.editor.cn;
import java.util.*;
//2049:统计最高分的节点数目
public class CountNodesWithTheHighestScore {
public static void main(String[] args) {
Solution solution = new CountNodesWithTheHighestScore().new Solution();
// TO TEST
solution.countHighestScoreNodes(new int[]{-1, 2, 0, 2, 0});
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
int[] counts;
public int countHighestScoreNodes(int[] parents) {
int size = parents.length;
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i = 0; i < size; i++) {
map.put(i, new ArrayList<>());
}
for (int i = 1; i < size; i++) {
map.get(parents[i]).add(i);
}
counts = new int[size];
for (int i = 0; i < size; i++) {
if (counts[i] > 0) {
continue;
}
counts[i] = dfs(map.get(i), map);
}
long mul = 1;
for (int num : map.get(0)) {
mul *= counts[num];
}
int count = 1;
for (int i = 1; i < size; i++) {
long temp = 1;
for (int num : map.get(i)) {
temp *= counts[num];
}
temp *= (size - counts[i]);
if (temp > mul) {
mul = temp;
count = 1;
} else if (temp == mul) {
count++;
}
}
return count;
}
private int dfs(List<Integer> list, Map<Integer, List<Integer>> map) {
if (list.size() == 0) {
return 1;
}
int count = 1;
for (int i : list) {
if (counts[i] > 0) {
count += counts[i];
} else {
count += dfs(map.get(i), map);
}
}
return count;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,48 @@
<p>给你一棵根节点为 <code>0</code>&nbsp;<strong>二叉树</strong>&nbsp;,它总共有 <code>n</code>&nbsp;个节点,节点编号为&nbsp;<code>0</code>&nbsp;&nbsp;<code>n - 1</code>&nbsp;。同时给你一个下标从&nbsp;<strong>0</strong>&nbsp;开始的整数数组&nbsp;<code>parents</code>&nbsp;表示这棵树,其中&nbsp;<code>parents[i]</code>&nbsp;是节点 <code>i</code>&nbsp;的父节点。由于节点 <code>0</code>&nbsp;是根,所以&nbsp;<code>parents[0] == -1</code>&nbsp;</p>
<p>一个子树的 <strong>大小</strong>&nbsp;为这个子树内节点的数目。每个节点都有一个与之关联的&nbsp;<strong>分数</strong>&nbsp;。求出某个节点分数的方法是,将这个节点和与它相连的边全部 <strong>删除</strong>&nbsp;,剩余部分是若干个 <strong>非空</strong>&nbsp;子树,这个节点的 <strong>分数</strong>&nbsp;为所有这些子树 <strong>大小的乘积</strong>&nbsp;</p>
<p>请你返回有 <strong>最高得分</strong>&nbsp;节点的 <strong>数目</strong>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>示例&nbsp;1:</strong></p>
<p><img alt="example-1" src="https://assets.leetcode.com/uploads/2021/10/03/example-1.png" style="width: 604px; height: 266px;"></p>
<pre><b>输入:</b>parents = [-1,2,0,2,0]
<b>输出:</b>3
<strong>解释:</strong>
- 节点 0 的分数为3 * 1 = 3
- 节点 1 的分数为4 = 4
- 节点 2 的分数为1 * 1 * 2 = 2
- 节点 3 的分数为4 = 4
- 节点 4 的分数为4 = 4
最高得分为 4 ,有三个节点得分为 4 (分别是节点 13 和 4 )。
</pre>
<p><strong>示例 2</strong></p>
<p><img alt="example-2" src="https://assets.leetcode.com/uploads/2021/10/03/example-2.png" style="width: 95px; height: 143px;"></p>
<pre><b>输入:</b>parents = [-1,2,0]
<b>输出:</b>2
<strong>解释:</strong>
- 节点 0 的分数为2 = 2
- 节点 1 的分数为2 = 2
- 节点 2 的分数为1 * 1 = 1
最高分数为 2 ,有两个节点分数为 2 (分别为节点 0 和 1 )。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>n == parents.length</code></li>
<li><code>2 &lt;= n &lt;= 10<sup>5</sup></code></li>
<li><code>parents[0] == -1</code></li>
<li>对于&nbsp;<code>i != 0</code>&nbsp;,有&nbsp;<code>0 &lt;= parents[i] &lt;= n - 1</code></li>
<li><code>parents</code>&nbsp;表示一棵二叉树。</li>
</ul>
<div><div>Related Topics</div><div><li></li><li>深度优先搜索</li><li>数组</li><li>二叉树</li></div></div><br><div><li>👍 53</li><li>👎 0</li></div>