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/7/18 4:20:27 阅读更多 →
HarmonyOS7 点击手势入门:onClick 事件的原理与实战

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

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

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

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

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

2026/7/18 4:19:27 阅读更多 →

最新新闻

h4xx0r背后的故事:打造一个用于网络安全研究的开放平台

h4xx0r背后的故事:打造一个用于网络安全研究的开放平台

h4xx0r背后的故事:打造一个用于网络安全研究的开放平台 【免费下载链接】h4xx0r h4xx0r.org home page 项目地址: https://gitcode.com/gh_mirrors/h4/h4xx0r h4xx0r作为一个专注于网络安全研究的开放平台,其核心功能是通过实验性网页展示各类网络…

2026/7/18 7:37:55 阅读更多 →
STM32定时中断配置与应用全解析

STM32定时中断配置与应用全解析

1. 项目概述:STM32定时中断的核心价值定时中断是嵌入式系统开发中最基础也最重要的功能之一。在STM32单片机中,TIM(Timer)模块提供了强大的定时器功能,能够实现精确的时间控制和事件触发。通过配置TIM定时中断&#xf…

2026/7/18 7:37:55 阅读更多 →
FPGA驱动蜂鸣器实现音乐合成的原理与实现

FPGA驱动蜂鸣器实现音乐合成的原理与实现

1. 项目概述:FPGA驱动蜂鸣器的音乐合成原理在嵌入式系统开发中,用FPGA驱动蜂鸣器播放音乐是一个经典的入门项目。这个设计看似简单,却融合了数字逻辑设计、时序控制和音频合成的核心概念。我十年前第一次用Xilinx Spartan-6实现《欢乐颂》播放…

2026/7/18 7:37:55 阅读更多 →
Windows目录遍历不再踩坑:godirwalk跨平台兼容性深度测评

Windows目录遍历不再踩坑:godirwalk跨平台兼容性深度测评

Windows目录遍历不再踩坑:godirwalk跨平台兼容性深度测评 【免费下载链接】godirwalk Fast directory traversal for Golang 项目地址: https://gitcode.com/gh_mirrors/go/godirwalk 你是否曾因Go的filepath.Walk在Windows上表现异常而头疼?&…

2026/7/18 7:37:55 阅读更多 →
UE5肉鸽游戏开发:从ECS架构到程序化生成的实战指南

UE5肉鸽游戏开发:从ECS架构到程序化生成的实战指南

1. 项目概述:从零到一,用UE5打造你的第一款肉鸽游戏如果你是一名游戏开发者,或者对游戏制作充满热情,那么“肉鸽游戏”(Roguelike/Roguelite)这个品类绝对是你绕不开的经典。它以其高重复可玩性、随机生成的…

2026/7/18 7:37:54 阅读更多 →
Mac存储空间管理与应用卸载完全指南

Mac存储空间管理与应用卸载完全指南

1. Mac存储空间管理全攻略作为Mac用户,最让人头疼的问题之一就是存储空间不足。当系统提示"磁盘空间不足"时,很多人会感到手足无措。其实macOS提供了完善的存储管理工具,只是很多用户没有充分利用。1.1 查看存储空间使用情况最直接…

2026/7/18 7:36:54 阅读更多 →

日新闻

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:38 阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:38 阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:38 阅读更多 →

周新闻

月新闻