力扣(leetcode)每日一题 2374 边积分最高的节点

题干

2374. 边积分最高的节点 - 力扣(LeetCode)

给你一个有向图,图中有 n 个节点,节点编号从 0n - 1 ,其中每个节点都 恰有一条 出边。

图由一个下标从 0 开始、长度为 n 的整数数组 edges 表示,其中 edges[i] 表示存在一条从节点 i 到节点 edges[i]有向 边。

节点 i边积分 定义为:所有存在一条指向节点 i 的边的节点的 编号 总和。

返回 边积分 最高的节点。如果多个节点的 边积分 相同,返回编号 最小 的那个。

示例 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 。
解法

看着是图的遍历,但是仔细一看就是一个非常简单的贪心。每次刷新记录最大值刷新最大值就好了。

妥妥的属于简单题

如下

原始代码如下(这是错误的)

第一,这里不需要map,map的效率没有初始化数组高

第二,这里的最大值,会溢出Integer.MAX_VALUE 因此需要用long来记录

java 复制代码
  public static int edgeScore1(int[] edges) {
        int max = 0;
        int maxindex = Integer.MAX_VALUE;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < edges.length; i++) {
            int edge = edges[i];
            Integer value = map.getOrDefault(edge, 0);
            map.put(edge, value + i);
            if (max < value + i) {
                max = value + i;
                maxindex = edge;
            } else if (max == value + i) {
                if (maxindex > edge) {
                    maxindex = edge;
                }
            }
        }
        return maxindex;
    }

修改后如下

java 复制代码
public static int edgeScore(int[] edges) {
        long[] dp = new long[edges.length]; // 随便取的名字
        long max = 0;
        int maxindex = Integer.MAX_VALUE;
        for (int i = 0; i < edges.length; i++) {
            int edge = edges[i];   // 取出指向的点
            dp[edge] += i;     // 指向的点的累计加上i值
            if (max < dp[edge]) {    // 更新最大值
                max = dp[edge];
                maxindex = edge;
            } else if (max == dp[edge]) {  // 当前值和最大值相等判断下下标哪个更小
                if (maxindex > edge) {
                    maxindex = edge;
                }
            }
        }
        return maxindex;
    }
相关推荐
hetao173383716 小时前
2026-08-27~29 hetao1733837 的刷题记录
c++·算法
云淡风轻~窗明几净16 小时前
宇宙管理学猜想
算法·图论
春风解人意16 小时前
从零开始学习嵌入式P28----线程
c语言·学习·算法
luj_176816 小时前
合法避税与投资评估实战指南
c语言·开发语言·网络·经验分享·算法
Bruce_Liuxiaowei17 小时前
驴滑块拼图游戏:从19世纪的纸片谜题到数学博弈论
人工智能·算法
一直C17 小时前
Linux系统编程|信号进阶 + SystemV IPC(消息队列、共享内存)
linux·c语言·开发语言·算法·青少年编程·vim
鹿角片ljp18 小时前
LeetCode 141. 环形链表|从 HashSet 到快慢指针 O (1) 空间最优解
算法·leetcode·链表
薛定e的猫咪18 小时前
(NeurIPS 2022)GraphGPS:MPNN 与全局注意力的融合之道
人工智能·深度学习·学习·算法
AI服务老曹19 小时前
车牌识别算法接入AI视频分析平台的流程和误报优化
人工智能·算法·音视频
神威难绷泪19 小时前
Linux应用软件编程:线程分离属性 互斥机制 同步机制 死锁
linux·开发语言·算法·线程