news 2026/8/21 8:09:59

DeepSeek LeetCode LCP 16. 游乐园的游览计划 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode LCP 16. 游乐园的游览计划 Java实现

这道题的核心是在无向图中找到两个共享顶点A的三角形(A-B-C-A 和 A-B'-C'-A),使得它们覆盖的不同顶点权值之和最大。

由于数据规模较大(顶点和边最多10000),暴力枚举所有三角形会超时,通常采用根号分治来优化。

Java实现代码

```java
import java.util.*;

class Solution {
public int maxWeight(int[][] edges, int[] value) {
int n = value.length;
// 1. 建图:邻接表(用于遍历) + 邻接矩阵(用于快速判断边是否存在)
List<Integer>[] graph = new List[n];
boolean[][] hasEdge = new boolean[n][n];
for (int i = 0; i < n; i++) graph[i] = new ArrayList<>();
for (int[] e : edges) {
int u = e[0], v = e[1];
graph[u].add(v);
graph[v].add(u);
hasEdge[u][v] = hasEdge[v][u] = true;
}

// 2. 根号分治:度数 > limit 的为“大点”,否则为“小点”
int limit = (int) Math.sqrt(n);
boolean[] isBig = new boolean[n];
for (int i = 0; i < n; i++) {
if (graph[i].size() > limit) isBig[i] = true;
}

// 存储每个顶点参与的三角形(只存顶点三元组和权值和)
List<int[]>[] triByVertex = new List[n];
for (int i = 0; i < n; i++) triByVertex[i] = new ArrayList<>();

// 3. 枚举所有三角形
// 3.1 枚举小点 v:枚举其两个邻居 a, b,检查 a,b 是否相连
for (int v = 0; v < n; v++) {
if (isBig[v]) continue;
List<Integer> adj = graph[v];
for (int i = 0; i < adj.size(); i++) {
for (int j = i + 1; j < adj.size(); j++) {
int a = adj.get(i), b = adj.get(j);
if (hasEdge[a][b]) {
int sum = value[v] + value[a] + value[b];
triByVertex[v].add(new int[]{v, a, b, sum});
triByVertex[a].add(new int[]{v, a, b, sum});
triByVertex[b].add(new int[]{v, a, b, sum});
}
}
}
}

// 3.2 枚举大点:枚举任意三个大点,检查是否两两相连
List<Integer> bigNodes = new ArrayList<>();
for (int i = 0; i < n; i++) if (isBig[i]) bigNodes.add(i);
for (int i = 0; i < bigNodes.size(); i++) {
for (int j = i + 1; j < bigNodes.size(); j++) {
for (int k = j + 1; k < bigNodes.size(); k++) {
int a = bigNodes.get(i), b = bigNodes.get(j), c = bigNodes.get(k);
if (hasEdge[a][b] && hasEdge[a][c] && hasEdge[b][c]) {
int sum = value[a] + value[b] + value[c];
triByVertex[a].add(new int[]{a, b, c, sum});
triByVertex[b].add(new int[]{a, b, c, sum});
triByVertex[c].add(new int[]{a, b, c, sum});
}
}
}
}

// 4. 计算答案:枚举公共顶点 A,找两个最优三角形组合
int ans = 0;
for (int a = 0; a < n; a++) {
List<int[]> tris = triByVertex[a];
if (tris.size() < 2) {
// 只有一个三角形时,只能游玩一个,答案就是该三角形的权值和
if (tris.size() == 1) ans = Math.max(ans, tris.get(0)[3]);
continue;
}
// 按权值和降序排序,只需考虑前几个
tris.sort((x, y) -> y[3] - x[3]);
// 尝试前 min(5, size) 个组合,通常足够
for (int i = 0; i < Math.min(5, tris.size()); i++) {
for (int j = i + 1; j < Math.min(5, tris.size()); j++) {
int[] t1 = tris.get(i), t2 = tris.get(j);
Set<Integer> set = new HashSet<>();
set.add(t1[0]); set.add(t1[1]); set.add(t1[2]);
set.add(t2[0]); set.add(t2[1]); set.add(t2[2]);
int sum = 0;
for (int node : set) sum += value[node];
ans = Math.max(ans, sum);
}
}
}
return ans;
}
}
```

复杂度分析

· 时间复杂度:O(N√N),在 N=10000 的规模下可接受。
· 空间复杂度:O(N + M),用于存储图、邻接矩阵及三角形信息。

核心思路

1. 问题转化:将游玩路径抽象为两个共享顶点 A 的三角形。
2. 高效找三角形:利用“根号分治”平衡大小顶点的枚举开销,避免 O(N^3) 的暴力。
3. 枚举组合:对每个顶点 A,枚举其参与的所有三角形,取两个去重后权值和最大的组合。
4. 剪枝优化:只需考虑每个顶点下权值和最大的前几个三角形进行组合,无需全量枚举。

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

医疗器械管理类别判定全流程指南

我国对医疗器械按风险程度实行三类管理——第一类风险最低&#xff0c;第二类中度风险&#xff0c;第三类风险最高。第一类医疗器械实行产品备案管理&#xff0c;由市级药品监管部门负责&#xff1b;第二类、第三类医疗器械实行产品注册管理&#xff0c;分别由省级和国家级药品…

作者头像 李华
网站建设 2026/8/21 8:07:38

180、【Agent】【OpenCode】TuiThreadCmd(类型增长)

【声明】本博客所有内容均为个人业余时间创作&#xff0c;所述技术案例均来自公开开源项目&#xff08;如Github&#xff0c;Apache基金会&#xff09;&#xff0c;不涉及任何企业机密或未公开技术&#xff0c;如有侵权请联系删除 标题 180、【Agent】【OpenCode】TuiThreadCm…

作者头像 李华
网站建设 2026/8/21 8:05:04

TOPSIS优劣解距离法:从原理到Python实战的多属性决策指南

1. 项目概述&#xff1a;从“谁更好”到“量化决策”的桥梁在日常生活和工作中&#xff0c;我们常常面临一个看似简单却极其复杂的问题&#xff1a;如何从一堆各有千秋的选项中&#xff0c;选出一个“最好”的&#xff1f;比如&#xff0c;公司要采购一批设备&#xff0c;有A、…

作者头像 李华
网站建设 2026/8/21 8:03:53

数据结构:哈希表 算法相关 排序算法

八、哈希表哈希存储&#xff1a;将要存储数据的关键字和春初位置之间建立对应映射关系&#xff0c;存储数据时&#xff0c;按照映射关系寻找存储位置&#xff1b;查找数据&#xff0c;根据关键字和映射关系&#xff0c;寻找原数据的存储位置映射关系称为哈希函数&#xff08;散…

作者头像 李华
网站建设 2026/8/21 8:03:51

影刀RPA三大逻辑结构实战:顺序、分支与循环详解

你是不是觉得RPA&#xff08;机器人流程自动化&#xff09;听起来很酷&#xff0c;但一看到“逻辑”、“流程控制”这些词就有点发怵&#xff1f;觉得那是程序员才需要懂的东西&#xff0c;自己零基础根本玩不转&#xff1f; 别担心&#xff0c;这正是绝大多数RPA新手&#xf…

作者头像 李华
网站建设 2026/8/21 8:01:41

数学建模竞赛获奖论文逆向工程:从理论到代码的深度学习方法

1. 从获奖论文到实战工具箱&#xff1a;如何真正“消化”一份数模竞赛作品如果你正在准备数学建模竞赛&#xff0c;无论是美赛&#xff08;MCM/ICM&#xff09;、国赛还是校赛&#xff0c;手头有几篇往年的获奖论文&#xff0c;尤其是像2016年HIMCM B题“购物和运输问题”这种典…

作者头像 李华