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

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

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

2026/7/24 10:57:21 阅读更多 →
HarmonyOS7 综合表单实战:多种输入组件 + 分组布局 + 验证提交

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

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

2026/7/24 8:15:48 阅读更多 →

最新新闻

FCA-RL框架:动态出行市场的智能定价与调度策略

FCA-RL框架:动态出行市场的智能定价与调度策略

1. 项目背景与核心价值在出行服务领域,市场环境瞬息万变——早晚高峰的运力需求波动、节假日特殊出行模式、突发天气事件影响,这些动态因素让传统静态定价和调度策略频频失效。我们团队在ECML-PKDD 2025提出的FCA-RL框架,正是为了解决这个行业…

2026/7/24 11:16:47 阅读更多 →
企业级AI推理体系构建指南:从需求到落地

企业级AI推理体系构建指南:从需求到落地

1. 企业AI推理体系构建的必要性 最近两年,AI技术在企业中的应用呈现爆发式增长。从最初的简单聊天机器人,到现在能够处理复杂业务流程的智能系统,AI正在深刻改变企业的运营方式。但随之而来的问题是:很多企业在匆忙上马AI项目时&a…

2026/7/24 11:16:47 阅读更多 →
Web自动化测试弹框处理全攻略:从原理到Selenium/Pytest实战

Web自动化测试弹框处理全攻略:从原理到Selenium/Pytest实战

1. 项目概述:Web自动化测试中的“弹框”挑战 在Web自动化测试的日常工作中,遇到弹框(Dialog/Popup)几乎是家常便饭。无论是登录成功后的提示、操作确认的警告,还是系统抛出的错误信息,这些弹框就像路上的“…

2026/7/24 11:16:47 阅读更多 →
千笔AI:专科生论文写作智能辅助系统解析

千笔AI:专科生论文写作智能辅助系统解析

1. 项目背景与核心价值 作为一名在学术写作领域摸爬滚打多年的从业者,我深刻理解专科生在论文写作过程中面临的困境。每到毕业季,总能看到大量学生被开题报告、文献综述、格式调整等琐碎工作折磨得焦头烂额。2026年即将面世的"千笔AI"正是针对…

2026/7/24 11:16:47 阅读更多 →
计算机毕业设计之动漫网站的设计与实现

计算机毕业设计之动漫网站的设计与实现

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&#xf…

2026/7/24 11:16:47 阅读更多 →
大模型推理部署优化全景指南:从显存管理到分布式架构

大模型推理部署优化全景指南:从显存管理到分布式架构

大模型推理部署优化全景指南:从显存管理到分布式架构 推理优化的商业价值 2026年,大语言模型已经全面渗透到企业生产环境中。但一个尴尬的现实是:很多团队能够训练或下载模型,却无法经济高效地运行它们。推理成本已经成为AI应用商…

2026/7/24 11:15:47 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻