当前位置: 首页 > news >正文

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()` 是最后一条边的贡献

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

http://www.jsqmd.com/news/1177412/

相关文章:

  • 分形时间动力学(FTD):揭示对话时间具有非整数豪斯多夫维度的分形结构(世毫九实验室原创理论)
  • 70.1.水位监测系统-超声版-基于STM32单片机物联网设计【硬件+APP+云平台】
  • 【技术干货】多模型AI编程代理实战:用Python统一接入Claude Opus 4.8
  • PIC18F97J60与CMT-8540S-SMT在嵌入式音频方案中的黄金组合
  • 接口测试平台开发实战(前后端简易版)
  • 每个专业主要学什么课程?实操多不多,有没有校内实训车间、设备?零基础孩子学得会吗?
  • 2026年最新教程:PDF 每一页怎么变成一张张图片 亲测有效 - 图片处理研究员
  • 2026年宁波威克仪表压力传感器多场景使用表现综合评测 - 起跑123
  • 2026潍坊漏水检测维修口碑榜TOP5权威推荐:正规防水补漏公司甄选-卫生间/厨房/阳台/屋顶/地下室渗漏水精准查漏:房屋防水补漏避坑指南 - 安佳防水
  • XOutput终极指南:免费让老游戏手柄重获新生的简单方法
  • Nanomsg中pubsub_demo详解
  • 2026成都补发假发实体店用户偏好排行一览 - 起跑123
  • Linux USB 2.0 合规性测试:libusb-test-mode 工具在 xHCI 控制器下的 5 步操作指南
  • S16.5 第一性原理做产品(5):从《与运气竞争》看AI产品价值——用户到底在“雇佣“什么
  • 装修公司底层逻辑与闭口合同机制:2026年天津家装选型技术分析
  • 5步快速上手Notepad--:跨平台文本编辑器的终极指南
  • 2026塑胶件镀膜场景 UV真空镀膜全自动喷漆线特性介绍 - 起跑123
  • 从零读懂 Transformer:大模型为什么这么强?一文讲透注意力机制
  • 2026年济南散酒批发 靠谱进货渠道要点汇总 - 起跑123
  • zk-SNARKs 与 zk-STARKs 对比评测:从 Zcash 到 StarkNet 的 5 大性能指标分析
  • 亲身到店探访合肥亨得利官方名表服务中心|服务电话和详细网点地址(2026年7月更新) - 亨得利官方
  • OpenBOR游戏引擎跨平台移植:从Windows到Android的完整实战指南
  • 2026探访成都口碑不错的假发门店个人体验记录 - 起跑123
  • LVGL PC模拟器 3种IDE方案对比:Visual Studio vs VSCode vs Code::Blocks
  • 鸿蒙三方库 | harmony-utils之DisplayUtil屏幕变化监听与折叠屏详解
  • 高精度ADC系统设计与PIC18LF47K40应用指南
  • 劳力士中国官方售后服务中心|服务电话及24小时维修地址权威信息声明(2026年7月更新) - 劳力士服务中心
  • C++与QT实现卡普雷卡尔常数可视化:从算法到图形界面的编程实践
  • 影刀RPA 图书馆管理自动化:图书借阅续借与逾期提醒
  • 2026漳州漏水检测维修口碑榜TOP5权威推荐:正规防水补漏公司甄选-卫生间/厨房/阳台/屋顶/地下室渗漏水精准查漏:房屋防水补漏避坑指南 - 安佳防水