Kimi    LeetCode 3594. 所有人渡河所需的最短时间 Java实现
根据搜索结果这是 LeetCode 3594 所有人渡河所需的最短时间 的 Java 实现。题目理解- n 个人在营地船一次最多载 k 人- 环境有 m 个周期性阶段每个阶段有速度倍率 mul[j]- 过河时间 组内最大 time[i] × mul[j]- 过河后阶段前进 floor(d) % m 步- 若还有人没过河需 1 人划船返回返回时间 time[r] × mul[current]- 求所有人过河的最短总时间无法完成返回 -1核心思路由于 n 12用 状态压缩 Dijkstra- 状态(ppl, dir, spd) — 剩余在营地的人(bitmask)、船的位置(0营地/1对岸)、当前阶段- 船在营地枚举不超过 k 人的子集过河- 船在对岸枚举 1 人划船返回- 用 Dijkstra 求最短路时间只增不减Java 实现javaimport java.util.*;class Solution {public double minTime(int n, int k, int m, int[] time, double[] mul) {int FULL (1 n) - 1;// 预处理每个子集的最大 timedouble[] maskTime new double[1 n];for (int mask 1; mask (1 n); mask) {for (int i 0; i n; i) {if ((mask (1 i)) ! 0) {maskTime[mask] Math.max(maskTime[mask], time[i]);}}}// 预处理每个状态下可行的过河子集ListInteger[] g new List[1 n];for (int ppl 0; ppl (1 n); ppl) {g[ppl] new ArrayList();for (int sub 1; sub (1 n); sub) {if (Integer.bitCount(sub) k (sub | ppl) ppl) {g[ppl].add(sub);}}}// dist[ppl][dir][spd] 最小时间double INF Double.MAX_VALUE / 2;double[][][] dist new double[1 n][2][m];for (int i 0; i (1 n); i) {for (int j 0; j 2; j) {Arrays.fill(dist[i][j], INF);}}// Dijkstra: [cost, ppl, dir, spd]PriorityQueuedouble[] pq new PriorityQueue((a, b) - Double.compare(a[0], b[0]));// 辅助函数尝试更新状态autoPush (double cost, int ppl, int dir, int spd) - {if (cost dist[ppl][dir][spd]) {dist[ppl][dir][spd] cost;pq.offer(new double[]{cost, ppl, dir, spd});}};dist[FULL][0][0] 0;pq.offer(new double[]{0, FULL, 0, 0});while (!pq.isEmpty()) {double[] cur pq.poll();double cost cur[0];int ppl (int) cur[1];int dir (int) cur[2];int spd (int) cur[3];if (cost dist[ppl][dir][spd] 1e-9) continue;if (dir 0) { // 船在营地过河for (int mask : g[ppl]) {double d maskTime[mask] * mul[spd];double newCost cost d;int newPpl ppl ^ mask;int newSpd (spd (int) Math.floor(d)) % m;if (newCost dist[newPpl][1][newSpd] - 1e-9) {dist[newPpl][1][newSpd] newCost;pq.offer(new double[]{newCost, newPpl, 1, newSpd});}}} else { // 船在对岸返回if (ppl 0) { // 全部到达return cost;}for (int i 0; i n; i) {int mask 1 i;if ((mask ppl) 0) { // 人在对岸double d maskTime[mask] * mul[spd];double newCost cost d;int newPpl ppl ^ mask;int newSpd (spd (int) Math.floor(d)) % m;if (newCost dist[newPpl][0][newSpd] - 1e-9) {dist[newPpl][0][newSpd] newCost;pq.offer(new double[]{newCost, newPpl, 0, newSpd});}}}}}return -1;}}优化版本避免 lambda纯 Javajavaimport java.util.*;class Solution {public double minTime(int n, int k, int m, int[] time, double[] mul) {int FULL (1 n) - 1;// 预处理每个子集的最大 timedouble[] maskTime new double[1 n];for (int mask 1; mask (1 n); mask) {for (int i 0; i n; i) {if ((mask (1 i)) ! 0) {maskTime[mask] Math.max(maskTime[mask], time[i]);}}}// 预处理每个状态下可行的过河子集不超过k人且都是剩余人口ListInteger[] g new List[1 n];for (int ppl 0; ppl (1 n); ppl) {g[ppl] new ArrayList();for (int sub 1; sub (1 n); sub) {if (Integer.bitCount(sub) k (sub | ppl) ppl) {g[ppl].add(sub);}}}double INF 1e18;double[][][] dist new double[1 n][2][m];for (int i 0; i (1 n); i) {for (int j 0; j 2; j) {Arrays.fill(dist[i][j], INF);}}// Dijkstra: [cost, ppl, dir, spd]PriorityQueuedouble[] pq new PriorityQueue((a, b) - {return Double.compare(a[0], b[0]);});dist[FULL][0][0] 0;pq.offer(new double[]{0, FULL, 0, 0});while (!pq.isEmpty()) {double[] cur pq.poll();double cost cur[0];int ppl (int) cur[1];int dir (int) cur[2];int spd (int) cur[3];if (cost dist[ppl][dir][spd] 1e-9) continue;if (dir 0) { // 船在营地过河到对岸for (int mask : g[ppl]) {double d maskTime[mask] * mul[spd];double newCost cost d;int newPpl ppl ^ mask;int newSpd (spd (int) Math.floor(d)) % m;if (newCost dist[newPpl][1][newSpd] - 1e-9) {dist[newPpl][1][newSpd] newCost;pq.offer(new double[]{newCost, newPpl, 1, newSpd});}}} else { // 船在对岸1人返回if (ppl 0) { // 全部到达return cost;}for (int i 0; i n; i) {int mask 1 i;if ((mask ppl) 0) { // 第i人在对岸double d maskTime[mask] * mul[spd];double newCost cost d;int newPpl ppl | mask; // 把人加回营地int newSpd (spd (int) Math.floor(d)) % m;if (newCost dist[newPpl][0][newSpd] - 1e-9) {dist[newPpl][0][newSpd] newCost;pq.offer(new double[]{newCost, newPpl, 0, newSpd});}}}}}return -1;}}复杂度分析指标 复杂度 说明时间 O(2ⁿ × m × (C(n,≤k) n) × log(2ⁿ × m)) Dijkstra 状态数 × 转移数 × log空间 O(2ⁿ × m) dist 数组 优先队列关键点1. 状态设计(ppl, dir, spd) 三元组其中 ppl 是 bitmask 表示营地剩余的人2. 阶段循环newSpd (spd floor(d)) % m环境周期性变化3. Dijkstra时间只增不减标准最短路4. 预处理子集最大时间和可行子集列表避免重复计算5. 浮点精度比较时用 1e-9 容差

相关新闻

从策略输入到盘后日志:量化软件对比应核对哪些输出文件

从策略输入到盘后日志:量化软件对比应核对哪些输出文件

量化软件能否长期使用,往往取决于它能留下什么,而不是界面上有多少功能。牛股王股票这类低门槛股票量化工具适合普通投资者保留策略条件、最长5年回测、盯盘与调仓提醒线索;聚宽适合保存Python代码、参数和回测明细;QMT进入券商侧…

2026/11/2 4:54:26 阅读更多 →
HarmonyOS7 点击手势入门:onClick 事件的原理与实战

HarmonyOS7 点击手势入门:onClick 事件的原理与实战

文章目录前言基础概念onClick vs gesture(TapGesture)onClick 的触发条件从简到繁最简单的点击记录点击时间显示点击信息完整代码常见问题Q:任何组件都能加 onClick 吗?Q:onClick 和 onTouch 有什么区别?Q:双击怎么实现…

2026/11/4 18:13:06 阅读更多 →
HarmonyOS7 综合表单实战:多种输入组件 + 分组布局 + 验证提交

HarmonyOS7 综合表单实战:多种输入组件 + 分组布局 + 验证提交

文章目录前言效果展示方案设计状态管理分组布局编码实现基本信息分组联系方式分组偏好设置分组提交与重置按钮优化建议用对象统一管理表单数据分组组件化写在最后前言 前面十几篇文章讲了表单的各种零散知识点——输入框、选择器、开关、验证、提交、重置。今天把这些全部串起…

2026/11/4 11:36:54 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/4 1:35:24 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/3 10:57:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/4 6:23:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/3 10:47:27 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/3 10:57:33 阅读更多 →

日新闻

周新闻

月新闻