news 2026/7/13 1:02:33

Kimi LeetCode 3547. 图中边值的最大和 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode 3547. 图中边值的最大和 Java实现

以下是 LeetCode 3547. 图中边值的最大和 的 Java 实现。

解题思路

由于每个节点最多与其他两个节点相连,整个图由若干链和环组成。核心贪心策略:

1. 先处理环,再处理链——环的每节点度数为 2,能贡献更多边权;链至少有一个端点度数为 1。
2. 链按长度降序处理——长链能贡献更多边,优先分配大数。
3. 填数策略——将剩余的最大数放在连通分量的中间,次大的数交替向两边扩展,使得大数尽量相邻(类似排序不等式)。

时间复杂度 O(n \log n),空间复杂度 O(n)。

---

Java 代码

```java
import java.util.*;

class Solution {
public long maxScore(int n, int[][] edges) {
long ans = 0;

// 建图
List<Integer>[] graph = new List[n];
for (int i = 0; i < n; i++) {
graph[i] = new ArrayList<>();
}
for (int[] edge : edges) {
int u = edge[0], v = edge[1];
graph[u].add(v);
graph[v].add(u);
}

boolean[] seen = new boolean[n];
List<Integer> cycleSizes = new ArrayList<>(); // 所有节点度数为2的连通分量(环)
List<Integer> pathSizes = new ArrayList<>(); // 其余连通分量(链)

// 遍历每个连通分量
for (int i = 0; i < n; i++) {
if (seen[i]) continue;
List<Integer> component = getComponent(graph, i, seen);
// 判断是否为环:所有节点度数均为2
boolean allDegree2 = true;
for (int u : component) {
if (graph[u].size() != 2) {
allDegree2 = false;
break;
}
}
if (allDegree2) {
cycleSizes.add(component.size());
} else if (component.size() > 1) {
pathSizes.add(component.size());
}
// 孤立点(size==1)不贡献边权,无需处理
}

// 先处理环:从剩余的最大数中分配
for (int cycleSize : cycleSizes) {
ans += calculateScore(n - cycleSize + 1, n, true);
n -= cycleSize;
}

// 链按长度从大到小排序,优先处理长链
Collections.sort(pathSizes, Collections.reverseOrder());
for (int pathSize : pathSizes) {
ans += calculateScore(n - pathSize + 1, n, false);
n -= pathSize;
}

return ans;
}

// BFS/DFS 获取连通分量中的所有节点
private List<Integer> getComponent(List<Integer>[] graph, int start, boolean[] seen) {
List<Integer> component = new ArrayList<>();
Queue<Integer> queue = new LinkedList<>();
queue.offer(start);
seen[start] = true;
component.add(start);

while (!queue.isEmpty()) {
int u = queue.poll();
for (int v : graph[u]) {
if (!seen[v]) {
seen[v] = true;
queue.offer(v);
component.add(v);
}
}
}
return component;
}

/**
* 计算将 [left, right] 范围内的数填入一个连通分量的最大边权和
*
* 填数策略:用双端队列模拟,初始放入两个最大值 right
* 从 right-1 递减到 left,每次取出队列前端与当前值相乘,再将当前值放入队尾
* 这样大数会集中在中间,次大数交替向两边扩展
*
* @param left 可用数的最小值
* @param right 可用数的最大值
* @param isCycle 是否为环(环需要额外加上首尾相连的一条边)
* @return 该连通分量的最大边权和
*/
private long calculateScore(int left, int right, boolean isCycle) {
Deque<Long> deque = new ArrayDeque<>();
deque.offerLast((long) right);
deque.offerLast((long) right);
long score = 0;

for (int value = right - 1; value >= left; value--) {
long windowValue = deque.pollFirst();
score += windowValue * value;
deque.offerLast((long) value);
}

// 如果是环,首尾两个节点也相邻,额外加上它们的乘积
if (isCycle) {
score += deque.peekFirst() * deque.peekLast();
}
return score;
}
}
```

---

关键说明

要点 说明
连通分量分类 所有节点度数均为 2 → 环;否则为链(含孤立点)
处理顺序 环优先于链,因为环的每个节点都有两条边,大数在环中能产生更多乘积;链按长度降序,长链优先拿大数
calculateScore 双端队列模拟"中间放大数,向两边递减"的排列。例如 `[left..right]=[7,8,9,10,11]`,排列为 `9-11-10-8-7`,相邻乘积和最大
环额外处理 环首尾相连,所以 `deque.peekFirst() * deque.peekLast()` 是最后一条边的贡献

> 注意:这道题在赛后被社区发现部分测试数据存在争议(官方答案可能不是最优),但上述贪心策略是标准竞赛解法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 0:56:50

Python命名规范大揭秘!这些规则你可千万别踩雷

中标识符的命名规范以及关键字首先中的标识符是程序员自己规定的具有特殊含义的词汇&#xff0c;比如:变量名&#xff0c;函数名&#xff0c;对象名。。。标识符的命名规范&#xff1a;1.标识符用字母,数字以及下划线组成2.标识符不能以数字开头3.标识符不能使用关键字和保留字…

作者头像 李华
网站建设 2026/7/13 0:56:44

python interpreter Python的GIL锁死你多线程?CPU密集任务跑得比单线程还慢,气炸了

开发者一直困惑的多线程机制是, 明明开启了多线程, 处理CPU密集型任务时, 性能却没提升, 甚至比单线程更慢。其背后核心原因是全局解释器锁&#xff08;GIL&#xff09;, 它是面试高频考察难点, 也是技术社区常年讨论热门话题。把GIL的底层原理进行拆解, 对多线程失效的核心原因…

作者头像 李华
网站建设 2026/7/13 0:48:24

Dev-C++ 入门:只需60秒,从安装到运行你的第一行代码!

Dev C安装选择中文语言chinese 安装descript接受协议descriptdescript选择安装位置&#xff08;默认&#xff09;descript开始安装descript安装完成descriptDev-C 新建工程在 Dev-C 中&#xff0c;工程&#xff08;Project&#xff09;用于管理多个源文件&#xff0c;特别是在编…

作者头像 李华
网站建设 2026/7/13 0:46:28

UE5蓝图实战:从零搭建可交互游戏场景与性能优化指南

1. 项目概述与核心目标今天是我们UE5蓝图学习计划的第十四天&#xff0c;也是从“纸上谈兵”迈向“动手实干”的关键一步。在前面的日子里&#xff0c;我们完成了项目框架的搭建&#xff0c;创建了可以四处跑动的角色蓝图&#xff0c;但角色所处的世界还是一片虚无。一个没有场…

作者头像 李华
网站建设 2026/7/13 0:45:04

影刀RPA 医药行业自动化:药品信息采集与价格监控

影刀RPA 医药行业自动化&#xff1a;药品信息采集与价格监控作者&#xff1a;林焱一、什么情况用影刀处理医药数据 医药行业的信息管理痛点很明显&#xff1a;国家医保局每季度更新医保目录&#xff0c;各省市的药品挂网价格频繁调整&#xff0c;药企的市场部门需要实时掌握竞品…

作者头像 李华
网站建设 2026/7/13 0:29:04

Rust核心概念测试题及解析

以下是涵盖 Rust 核心概念的考试试题&#xff0c;每题均附有详细解析&#xff0c;可用于检验对 Rust 的理解程度。 一、选择题| 题号 | 题目 | 选项 | 答案 | 解析 | | :--- | :--- | :--- | :--- | :--- | | 1 | Rust 中&#xff0c;let x 5; 声明的变量 x 的默认生命周期是…

作者头像 李华