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

千问 LeetCode 2532.过桥的时间 TypeScript实现

下面给出 TypeScript 实现,思路与 Java 版本一致,使用四个优先队列模拟:

function findCrossingTime(n: number, k: number, time: number[][]): number {
// 1. 按效率排序:leftToRight + rightToLeft 越大效率越低,相同时下标越大效率越低
// 排序后下标即可代表效率优先级
time.sort((a, b) => (a[0] + a[2]) - (b[0] + b[2]));

// 等待过桥的工人:大顶堆,效率最低的优先
// 存储 [效率值, 下标]
const waitLeft: number[][] = [];
const waitRight: number[][] = [];

// 正在工作的工人:小顶堆,按完成时间排序
// 存储 [下标, 完成时间]
const workLeft: number[][] = [];
const workRight: number[][] = [];

// 堆操作辅助函数
const heapPush = (heap: number[][], item: number[], isMinHeap: boolean) => {
heap.push(item);
let i = heap.length - 1;
while (i > 0) {
const parent = Math.floor((i - 1) / 2);
const compare = isMinHeap
? heap[i][1] < heap[parent][1]
: heap[i][0] > heap[parent][0];
if (compare) {
[heap[i], heap[parent]] = [heap[parent], heap[i]];
i = parent;
} else break;
}
};

const heapPop = (heap: number[][], isMinHeap: boolean): number[] | undefined => {
if (heap.length === 0) return undefined;
const top = heap[0];
const last = heap.pop()!;
if (heap.length > 0) {
heap[0] = last;
let i = 0;
const n = heap.length;
while (true) {
let smallest = i;
const left = 2 * i + 1;
const right = 2 * i + 2;
if (left < n) {
const compare = isMinHeap
? heap[left][1] < heap[smallest][1]
: heap[left][0] > heap[smallest][0];
if (compare) smallest = left;
}
if (right < n) {
const compare = isMinHeap
? heap[right][1] < heap[smallest][1]
: heap[right][0] > heap[smallest][0];
if (compare) smallest = right;
}
if (smallest !== i) {
[heap[i], heap[smallest]] = [heap[smallest], heap[i]];
i = smallest;
} else break;
}
}
return top;
};

const heapPeek = (heap: number[][]): number[] | undefined => heap[0];

// 初始所有工人在左侧等待
for (let i = k - 1; i >= 0; i--) {
heapPush(waitLeft, [i, 0], false); // 大顶堆,按效率值(下标)比较
}

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

while (remain > 0 || workRight.length > 0 || waitRight.length > 0) {
// 1. 将当前时间前完成工作的工人移到等待队列
while (workLeft.length > 0 && heapPeek(workLeft)![1] <= curTime) {
const [id] = heapPop(workLeft, true)!;
heapPush(waitLeft, [id, 0], false);
}
while (workRight.length > 0 && heapPeek(workRight)![1] <= curTime) {
const [id] = heapPop(workRight, true)!;
heapPush(waitRight, [id, 0], false);
}

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

// 收尾:所有箱子已搬完,让右侧所有工人依次过桥回到左岸
while (workRight.length > 0) {
const [id, finishTime] = heapPop(workRight, true)!;
curTime = Math.max(curTime, finishTime) + time[id][2];
}
while (waitRight.length > 0) {
const [id] = heapPop(waitRight, false)!;
curTime += time[id][2];
}

return curTime;
}

使用示例:

// 示例 1
console.log(findCrossingTime(1, 3, [[1,1,2,1],[1,1,3,1],[1,1,4,1]])); // 输出: 6

// 示例 2
console.log(findCrossingTime(3, 2, [[1,9,1,8],[10,10,10,10]])); // 输出: 50

关键说明:

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

时间复杂度 O((n+k) log k),空间复杂度 O(k),可高效通过题目数据范围。

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

相关文章:

  • 工业级神经网络实战:从训练崩溃到稳定上线的工程手册
  • 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:自贡眼镜、自贡配眼镜、乐山眼镜、乐山配眼镜、南充眼镜、南充配眼镜、巴中眼镜、巴中配眼镜、康利眼镜品牌镜框授权选择指南 - 优质品牌商家
  • MADQN实战:在Switch4环境中实现多智能体协同训练
  • 2026年评价高的围墙护栏可靠供应商推荐 - 行业平台推荐
  • AI模型能力受限发布机制解析:Gated Release原理与实践
  • AI工程师的技术信用铸造:从开源贡献到工程验证
  • 18 onenet mqttx 对接 设备 属性 上报 完整测试
  • 2026云南空压机服务商排行:四川,成都,昆明,四川离心空压机/四川英格索兰空压机/成都冷干机/成都寿力空压机/选择指南 - 优质品牌商家
  • AI项目博文写作规范与内容安全准则
  • 机器学习论文有效阅读:三层穿透法定位技术杠杆点
  • 基于LSTM的无人艇波浪方向估计:从时序预测到工程实践