[杨小白]_leetcode_力扣_第 93 场双周赛-第二题

68 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标2000分,现在1916!!

力扣第 93 场双周赛-力扣

第 93 场双周赛

参赛的人越来越少了,可算是跌破了3000了

近几次排名对比。

image.png

image.png

image.png

image.png

2497. 图中最大星和

给你一个 n 个点的无向图,节点从 0 到 n - 1 编号。给你一个长度为 n 下标从 0 开始的整数数组 vals ,其中 vals[i] 表示第 i 个节点的值。

同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 ai 和 bi 之间有一条双向边。

星图 是给定图中的一个子图,它包含一个中心节点和 0 个或更多个邻居。换言之,星图是给定图中一个边的子集,且这些边都有一个公共节点。

下图分别展示了有 3 个和 4 个邻居的星图,蓝色节点为中心节点。

image.png

星和 定义为星图中所有节点值的和。

给你一个整数 k ,请你返回 至多 包含 k 条边的星图中的 最大星和 。

示例1:

image.png

输入:vals = [1,2,3,4,10,-10,-20], edges = [[0,1],[1,2],[1,3],[3,4],[3,5],[3,6]], k = 2

输出:16

解释:上图展示了输入示例。

最大星和对应的星图在上图中用蓝色标出。中心节点是 3 ,星图中还包含邻居 1 和 4 。

无法得到一个和大于 16 且边数不超过 2 的星图。

示例 2:

输入: vals = [-5], edges = [], k = 0

输出: -5

解释: 只有一个星图,就是节点 0 自己。

所以我们返回 -5 。

提示:

  • n == vals.length
  • 1 <= n <= 105
  • -104 <= vals[i] <= 104
  • 0 <= edges.length <= min(n * (n - 1) / 2, 105)
  • edges[i].length == 2
  • 0 <= ai, bi <= n - 1
  • ai != bi
  • 0 <= k <= n - 1

代码

典型的图题,对于节点n,我们找到与节点n相连的所有节点的集合arr,对arr进行从大到小排序后,n作为星图,的最值就是arr中大于0的数中,最多选k个出来然后加上n本身的值。

所以,我们只需要将图简历好只后,对所有的arr排序,然后遍历中心节点,找到此节点作为星图的最大值,和全局最大值进行比较。

class Solution {
    public int maxStarSum(int[] vals, int[][] edges, int k) {
        if (k == 0) {
            int res = vals[0];
            for (int i = 0; i < vals.length; i++) {
                res = Math.max(res, vals[i]);
            }
            return res;
        }
        ArrayList<Integer>[] graph = new ArrayList[vals.length];
        for (int i = 0; i < graph.length; i++) {
            graph[i] = new ArrayList<Integer>();
        }
        for (int i = 0; i < edges.length; i++) {
            int a = edges[i][0];
            int b = edges[i][1];
            graph[a].add(b);
            graph[b].add(a);
        }
        for (int i = 0; i < graph.length; i++) {
            graph[i].sort((o1, o2) -> vals[o2] - vals[o1]);
        }
        int res = vals[0];
        for (int i = 0; i < vals.length; i++) {
            ArrayList<Integer> arr = graph[i];
            int temp = 0;
            for (int j = 0; j < k && j < arr.size(); j++) {
                if (vals[arr.get(j)] < 0) {
                    break;
                }
                temp += vals[arr.get(j)];
            }
            res = Math.max(res, temp + vals[i]);
        }
        return res;
    }
}

3.结束

也算是三题手速场,第四题wa了一个案例,就很生气。。。不过就算做了四题,也上不了几名。

小上一波分。

image.png

image.png