【每日一题】LeetCode 2374.边积分最高节点(图、哈希表)
题目描述
给定一个有向图,图中包含 n
个节点,节点编号从 0
到 n - 1
。每个节点都有一个出边,指向图中的另一个节点。图由一个长度为 n
的整数数组 edges
表示,其中 edges[i]
表示存在一条从节点 i
到节点 edges[i]
的有向边。
每个节点 i
的“边积分”定义为所有存在一条指向节点 i
的边的节点的编号之和。
任务是找出边积分最高的节点。如果多个节点的边积分相同,则返回编号最小的节点。
思路分析
-
初始化:创建一个长度为
n
的数组ans
用于存储每个节点的边积分,初始值都为0
。 -
计算边积分:遍历数组
edges
,对于每个节点i
,将其编号i
加到它指向的节点edges[i]
在数组ans
中对应的位置上。这样,每个节点的边积分就是所有指向它的节点编号的和。 -
寻找最大边积分:遍历数组
ans
,找到具有最大边积分的节点。如果有多个节点边积分相同,则选择编号最小的节点。 -
返回结果:返回边积分最高的节点的编号。
输入示例
-
示例 1:
- 输入:
edges = [1,0,0,0,0,7,7,5]
- 输出:
7
- 解释:- 节点 1、2、3 和 4 都有指向节点 0 的边,节点 0 的边积分等于 1 + 2 + 3 + 4 = 10 。- 节点 0 有一条指向节点 1 的边,节点 1 的边积分等于 0 。- 节点 7 有一条指向节点 5 的边,节点 5 的边积分等于 7 。- 节点 5 和 6 都有指向节点 7 的边,节点 7 的边积分等于 5 + 6 = 11 。节点 7 的边积分最高,所以返回 7 。
- 输入:
-
示例 2:
- 输入:
edges = [2,0,0,2]
- 输出:
0
- 解释:- 节点 1 和 2 都有指向节点 0 的边,节点 0 的边积分等于 1 + 2 = 3 。- 节点 0 和 3 都有指向节点 2 的边,节点 2 的边积分等于 0 + 3 = 3 。节点 0 和 2 的边积分都是 3 。由于节点 0 的编号更小,返回 0 。
提示:
n == edges.length
2 <= n <= 105
0 <= edges[i] < n
edges[i] != i
- 输入:
代码实现
class Solution {
public int edgeScore(int[] edges) {
// 获取节点数量
int n = edges.length;
// 初始化边积分数组,长度为 n,所有值初始化为 0
long[] ans = new long[n];
// 初始化最大边积分为最小值,用于比较
long max = Long.MIN_VALUE;
// 初始化最大边积分对应的节点索引
long index = -1;
// 遍历 edges 数组,计算每个节点的边积分
for (int i = 0; i < n; i++) {
int x = edges[i];
// 将当前节点的编号加到它指向的节点的边积分上
ans[x] += i;
}
// 遍历 ans 数组,找到边积分最大的节点
for (int j = 0; j < n; j++) {
// 如果当前节点的边积分大于已知的最大边积分,则更新最大边积分和对应的节点索引
if (max < ans[j]) {
max = ans[j];
index = j;
}
}
// 返回边积分最高的节点的编号
return (int) index;
}
}