LeetCode 2497.图中最大星和(c++)

71 阅读2分钟

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

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

2497.图中最大星和

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

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

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

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

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

给你一个整数 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 ,星图中还包含邻居 14 。
无法得到一个和大于 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

二、思路分析

这题就属于是知识盲区了,看了一下相关的知识,主要思路就是创建了一个二维容器,将每一个点的所有相邻点的值都存储进了这个二维容器。

后面的处理还有一步就是题目说的是至多k条边,但也可以不足k条边,这是值得注意的一点。

具体可以看注释!

三、AC代码

class Solution {
public:
    int maxStarSum(vector<int>& vals, vector<vector<int>>& edges, int k) {
        int n = vals.size();
        vector<vector<int>> f(n);  //创建二维容器
        for (auto &e : edges) {    //在这里直接以&e引用edge中的元素,比单纯用e要占用更少的内存
            if (vals[e[1]] > 0) {
                f[e[0]].push_back(vals[e[1]]);
            }
            if (vals[e[0]] > 0) {
                f[e[1]].push_back(vals[e[0]]);
            }
        }
        int reuslt = INT_MIN;           //在这里设置的是无穷小,防止出现点的值只有负数的情况
        for (int i = 0; i < n; i++) {
            int cur = vals[i];
            sort(f[i].rbegin(), f[i].rend());
            int upper = min(k, (int)r[i].size());   //防止出现相邻点最多的点的相邻边小于k的情况
            for (int j = 0; j < upper; j++) {
                cur += r[i][j];
            }
            reuslt = max(ans, cur);
        }
        return reuslt;
    }
};

提交排名

image.png

四、总结

接触到了新的题型。