开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个 n 个点的无向图,节点从 0 到 n - 1 编号。给你一个长度为 n 下标从 0 开始的整数数组 vals ,其中 vals[i] 表示第 i 个节点的值。
同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 ai 和 bi 之间有一条双向边。
星图 是给定图中的一个子图,它包含一个中心节点和 0 个或更多个邻居。换言之,星图是给定图中一个边的子集,且这些边都有一个公共节点。
下图分别展示了有 3 个和 4 个邻居的星图,蓝色节点为中心节点。
星和 定义为星图中所有节点值的和。
给你一个整数 k ,请你返回 至多 包含 k 条边的星图中的 最大星和 。
示例 1:
输入: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
二、思路分析
这题就属于是知识盲区了,看了一下相关的知识,主要思路就是创建了一个二维容器,将每一个点的所有相邻点的值都存储进了这个二维容器。
后面的处理还有一步就是题目说的是至多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;
}
};
提交排名
四、总结
接触到了新的题型。