[杨小白]_leetcode_第306场周赛-第二题6149. 边积分最高的节点

164 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

第306场周赛-力扣

第306场周赛-力扣

306的第二题还算不难,基本把题目读懂了,就可以做出来了,注意会超int,竞赛时间内会把这个输入案例隐藏。第三题第四题就是干瞪眼了,难顶啊!!!

现在介绍这个题。

6149. 边积分最高的节点

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

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

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

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

示例 1

image.png

输入: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

image.png

输入: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

2.解法

这里放一个错误提交

class Solution {
    public int edgeScore(int[] edges) {
        //key = 节点  value = 积分
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < edges.length; i++) {
            if(map.containsKey(edges[i])) {
                map.put(edges[i],map.get(edges[i]) + i);
            } else {
                map.put(edges[i],i);
            }
        }
        int res = 0;
        int max = 0;
        for (Map.Entry<Integer,Integer> entry : map.entrySet()) {
            if (max < entry.getValue()) {
                max = entry.getValue();
                res = entry.getKey();
            } else if (max == entry.getValue()) {
                res = Math.min(res, entry.getKey());
            }
        }
        return res;
    }
}

这个是正确的

class Solution {
    public int edgeScore(int[] edges) {
        //key = 节点  value = 积分
        HashMap<Integer, Long> map = new HashMap<>();
        for (int i = 0; i < edges.length; i++) {
            if(map.containsKey(edges[i])) {
                map.put(edges[i],map.get(edges[i]) + i);
            } else {
                map.put(edges[i],(long)i);
            }
        }
        int res = 0;
        long max = 0;
        for (Map.Entry<Integer,Long> entry : map.entrySet()) {
            if (max < entry.getValue()) {
                max = entry.getValue();
                res = entry.getKey();
            } else if (max == entry.getValue()) {
                res = Math.min(res, entry.getKey());
            }
        }
        return res;
    }
}

解析

大家去吧错误代码执行以下就知道会在哪个输入案例报错了。 这个题也是没什么难度,用一个map集合,记录每个节点和对应指向它的值之和,最后遍历节点,找到值最大的那个节点就可以了。

时间复杂度O(n),在进一步优化也只能在空间复杂度上更改存放的数据类型了。

第一题链接如下

杨小白_leetcode_第306场周赛-第一题2373. 矩阵中的

第三题链接如下

杨小白_leetcode_第306场周赛-第三题6150. 根据模式串构造最小数字

3.结束

这个题作为第二题,算是比较简单的了,这个题平常遇到还算要能做出来的,刷题刷题,每天一道,三年1000道!!!!