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

千问 LeetCode 2532.过桥的时间 public int findCrossingTime(int n, int k, int[][] time)

这道题是LeetCode 2532“过桥的时间”,一道经典的多优先队列模拟题。核心思路是用四个堆来管理工人的四种状态,按规则模拟时间推进。

下面给出一个清晰、可直接运行的Java解法:

class Solution {
public int findCrossingTime(int n, int k, int[][] time) {
// 1. 按效率排序:leftToRight + rightToLeft 越大效率越低,相同时下标越大效率越低
// 这里用稳定排序,保证下标大的排在后面(效率低)
Arrays.sort(time, (a, b) -> (a[0] + a[2]) - (b[0] + b[2]));

// 等待过桥的工人:大顶堆,效率最低的优先
PriorityQueue<int[]> waitLeft = new PriorityQueue<>((a, b) -> b[0] - a[0]); // [效率值, 下标]
PriorityQueue<int[]> waitRight = new PriorityQueue<>((a, b) -> b[0] - a[0]);

// 正在工作的工人:小顶堆,按完成时间排序
PriorityQueue<int[]> workLeft = new PriorityQueue<>((a, b) -> a[1] - b[1]); // [下标, 完成时间]
PriorityQueue<int[]> workRight = new PriorityQueue<>((a, b) -> a[1] - b[1]);

// 初始所有工人在左侧等待
for (int i = k - 1; i >= 0; i--) {
waitLeft.offer(new int[]{i, 0}); // 效率值用下标代替,因为已排序
}

int curTime = 0;
int remain = n; // 剩余需要搬运的箱子数

while (remain > 0 || !workRight.isEmpty() || !waitRight.isEmpty()) {
// 1. 将当前时间前完成工作的工人移到等待队列
while (!workLeft.isEmpty() && workLeft.peek()[1] <= curTime) {
int id = workLeft.poll()[0];
waitLeft.offer(new int[]{id, 0});
}
while (!workRight.isEmpty() && workRight.peek()[1] <= curTime) {
int id = workRight.poll()[0];
waitRight.offer(new int[]{id, 0});
}

// 2. 优先让右侧工人过桥
if (!waitRight.isEmpty()) {
int id = waitRight.poll()[0];
curTime += time[id][2]; // rightToLeft
workLeft.offer(new int[]{id, curTime + time[id][3]}); // 到达左岸后放箱子
}
// 3. 否则,如果还有箱子要搬且左侧有人,派左侧工人过桥
else if (remain > 0 && !waitLeft.isEmpty()) {
int id = waitLeft.poll()[0];
curTime += time[id][0]; // leftToRight
workRight.offer(new int[]{id, curTime + time[id][1]}); // 到达右岸后搬箱子
remain--;
}
// 4. 无人过桥,时间跳到下一个事件发生的时间
else {
int nextTime = Integer.MAX_VALUE;
if (!workLeft.isEmpty()) nextTime = Math.min(nextTime, workLeft.peek()[1]);
if (!workRight.isEmpty()) nextTime = Math.min(nextTime, workRight.peek()[1]);
curTime = nextTime;
}
}

// 最后,所有箱子已搬完,但右侧可能还有工人未回到左岸
// 需要让所有右侧工人(包括正在工作的)依次过桥
while (!workRight.isEmpty()) {
int[] worker = workRight.poll();
curTime = Math.max(curTime, worker[1]) + time[worker[0]][2];
}
while (!waitRight.isEmpty()) {
int id = waitRight.poll()[0];
curTime += time[id][2];
}

return curTime;
}
}

关键点说明:

1. 效率排序:先按 leftToRight + rightToLeft 排序,总和越大效率越低;相同时下标大的效率低。排序后下标即可代表效率优先级。
2. 四个堆的作用:
- waitLeft / waitRight:等待过桥的工人,大顶堆,效率最低的先过桥。
- workLeft / workRight:正在工作的工人,小顶堆,按完成时间排序,时间到了就移到等待队列。
3. 模拟逻辑:每个循环先处理完成工作的工人,然后优先让右侧工人过桥,其次才是左侧工人(且需有剩余箱子)。如果无人过桥,时间跳到下一个完成事件。
4. 收尾处理:所有箱子搬完后,右侧可能还有工人没回来,需要让他们依次过桥回到左岸。

这个解法的时间复杂度为 O((n+k) log k),空间复杂度 O(k),可以高效通过题目的大数据范围(n, k ≤ 10⁴)。

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

相关文章:

  • 神经网络工程化:从信号处理视角解剖CNN/RNN/Transformer设计逻辑
  • 8051汇编DW指令字节序问题与解决方案
  • 用LLM嵌入向量破解工业微缺陷检测的长尾难题
  • 巴别鸟vs坚果云:企业云盘同步机制踩坑与实战配置
  • Lovable框架实战速成:3天掌握UI动效、状态管理与热重载调试全流程
  • AI周报如何成为技术决策的精准导航仪
  • AI算力增长的绿色悖论:硬件生产与模型训练的环境成本分析
  • Predictive Lead Scoring实战:B2B销售线索智能评分与CRM集成
  • 千问 LeetCode 2532.过桥的时间 TypeScript实现
  • 工业级神经网络实战:从训练崩溃到稳定上线的工程手册
  • AI Agent Runtime 正在成为新基础设施层
  • AI生存期预测:原理、临床边界与伦理实践指南
  • 从能算到秒杀:完全平方数与最少数量的数学真相
  • Agent Runtime 重构:Session 作为事件日志的工程实践
  • 2026年Q2北京陈年老酒回收机构评测:三家合规实体对比 - 优质品牌商家
  • 千问 LeetCode 2538. 最大价值和与最小价值和的差值 Java实现
  • MoE混合专家架构:大模型高效推理的核心原理与工程实践
  • 功率电感选型深度指南:从DC-DC纹波控制到饱和电流与EMI优化
  • 第六章 投票系统项目设计与架构规划
  • 大模型MoE架构揭秘:如何用2%参数实现万亿级算力调度
  • 工业级时间序列预测:从股票预测到电力、交通、设备、零售四大落地场景
  • 论文查重与 AI 痕迹双焦虑?okbiye 降重 + 降 AIGC 功能,一键解决毕业季两大难题
  • GPT-4稀疏激活原理:1.8万亿参数如何实现2%高效计算
  • 2026绵阳中高端板材厂家权威排行:多功能海洋板/多功能海洋板厂家/实木板材/实木颗粒板厂家/五大头部品牌盘点 - 优质品牌商家
  • Scikit-Learn特征选择三大范式实战:过滤/包裹/嵌入法落地要点
  • Mythos架构解析:大模型可验证推理与责任门控机制
  • 24 鸿蒙LiteOS GPIO中断实战:从原理到上升沿/下降沿详解
  • Mythos能力解析:大模型可验证推理与Gated Release机制
  • AI代理运行时基础设施:告别上下文溢出与不可靠执行
  • 2026年成都999:自贡眼镜、自贡配眼镜、乐山眼镜、乐山配眼镜、南充眼镜、南充配眼镜、巴中眼镜、巴中配眼镜、康利眼镜品牌镜框授权选择指南 - 优质品牌商家