【打卡】车厢重排
buffers = [deque() for _ in range(k)]
next_carriage = 1
out = []
- 创建
k
个空的缓冲轨道(双端队列) next_carriage
变量跟踪当前需要输出的车厢编号(从 1 开始)out
列表记录最终输出的车厢原始索引
for i, carriage in enumerate(carriages):if carriage == next_carriage:# 直接输出out.append(i)next_carriage += 1# 检查缓冲轨道中是否有可以输出的车厢while True:moved = Falsefor buffer in buffers:if buffer and buffer[0] == next_carriage:out.append(carriages.index(buffer.popleft()))next_carriage += 1moved = Trueif not moved:breakelse:# 寻找合适的缓冲轨道valid_buffer = Nonemax_tail = -1for j, buffer in enumerate(buffers):if not buffer or buffer[-1] < carriage:if buffer and buffer[-1] > max_tail:valid_buffer = jmax_tail = buffer[-1]elif not buffer and valid_buffer is None:valid_buffer = jif valid_buffer is not None:buffers[valid_buffer].append(carriage)else:return "错误:任务不可能完成。"
- 如果当前车厢编号恰好是下一个需要输出的(
next_carriage
),则直接输出 - 输出后,检查所有缓冲轨道的头部,看是否有下一个需要的车厢
- 如果当前车厢不能直接输出,则尝试将其放入合适的缓冲轨道:
- 优先选择尾部车厢编号最大且小于当前车厢编号的轨道
- 如果没有这样的轨道,则选择一个空轨道
- 如果没有合适的轨道,则任务无法完成
while next_carriage <= n:moved = Falsefor buffer in buffers:if buffer and buffer[0] == next_carriage:out.append(carriages.index(buffer.popleft()))next_carriage += 1moved = Trueif not moved:return "错误:任务不可能完成。"
- 遍历完所有输入车厢后,检查缓冲轨道中是否还有剩余车厢需要输出
- 如果无法按顺序输出所有车厢,则任务失败
体会:
完成这道铁路车厢重排问题的代码实现,让我对贪心算法和数据结构的应用有了更深刻的理解。核心难点在于如何合理利用有限的缓冲轨道(栈结构)调度车厢顺序,其中 “选择尾部最大且小于当前车厢的轨道” 这一贪心策略是解题关键,它通过局部最优选择确保全局可行解,体现了贪心算法的典型思维。
过程中需要反复验证车厢能否直接输出或入栈,同时处理边界情况(如轨道为空或无合适轨道时的判断),这锻炼了逻辑的严密性。例如,遍历输入时需即时检查缓冲轨道头部是否有可输出车厢,避免遗漏连续顺序的情况,这一步的循环设计需仔细权衡终止条件。