力扣(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;
    }
相关推荐
CoovallyAIHub11 小时前
空间智能!李飞飞、LeCun&谢赛宁联手提出“空间超感知”,长文阐述世界模型蓝图
深度学习·算法·计算机视觉
Dave.B12 小时前
【VTK核心过滤器详解】:vtkCleanPolyData 多边形数据清洗实战指南
算法·vtk
AiXed12 小时前
PC微信 device uuid 算法
前端·算法·微信
@木辛梓12 小时前
指针,数组,变量
开发语言·c++·算法
苏纪云13 小时前
数据结构期中复习
数据结构·算法
flashlight_hi13 小时前
LeetCode 分类刷题:141. 环形链表
javascript·算法·leetcode
初听于你13 小时前
Java五大排序算法详解与实现
数据结构·算法·排序算法
多多*13 小时前
牛客周赛 Round 117 ABCDE 题解
java·开发语言·数据结构·算法·log4j·maven
liu****14 小时前
13.POSIX信号量
linux·开发语言·c++·算法·1024程序员节
熬夜敲代码的小N14 小时前
仓颉ArrayList动态数组源码分析:从底层实现到性能优化
数据结构·python·算法·ai·性能优化