【打卡】车厢重排

【打卡】车厢重排_第1张图片

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 = False
            for buffer in buffers:
                if buffer and buffer[0] == next_carriage:
                    out.append(carriages.index(buffer.popleft()))
                    next_carriage += 1
                    moved = True
            if not moved:
                break
    else:
        # 寻找合适的缓冲轨道
        valid_buffer = None
        max_tail = -1
        for j, buffer in enumerate(buffers):
            if not buffer or buffer[-1] < carriage:
                if buffer and buffer[-1] > max_tail:
                    valid_buffer = j
                    max_tail = buffer[-1]
                elif not buffer and valid_buffer is None:
                    valid_buffer = j
        if valid_buffer is not None:
            buffers[valid_buffer].append(carriage)
        else:
            return "错误:任务不可能完成。"
  • 如果当前车厢编号恰好是下一个需要输出的(next_carriage),则直接输出
  • 输出后,检查所有缓冲轨道的头部,看是否有下一个需要的车厢
  • 如果当前车厢不能直接输出,则尝试将其放入合适的缓冲轨道:
    • 优先选择尾部车厢编号最大且小于当前车厢编号的轨道
    • 如果没有这样的轨道,则选择一个空轨道
    • 如果没有合适的轨道,则任务无法完成
while next_carriage <= n:
    moved = False
    for buffer in buffers:
        if buffer and buffer[0] == next_carriage:
            out.append(carriages.index(buffer.popleft()))
            next_carriage += 1
            moved = True
    if not moved:
        return "错误:任务不可能完成。"
  • 遍历完所有输入车厢后,检查缓冲轨道中是否还有剩余车厢需要输出
  • 如果无法按顺序输出所有车厢,则任务失败

体会:

完成这道铁路车厢重排问题的代码实现,让我对贪心算法和数据结构的应用有了更深刻的理解。核心难点在于如何合理利用有限的缓冲轨道(栈结构)调度车厢顺序,其中 “选择尾部最大且小于当前车厢的轨道” 这一贪心策略是解题关键,它通过局部最优选择确保全局可行解,体现了贪心算法的典型思维。

过程中需要反复验证车厢能否直接输出或入栈,同时处理边界情况(如轨道为空或无合适轨道时的判断),这锻炼了逻辑的严密性。例如,遍历输入时需即时检查缓冲轨道头部是否有可输出车厢,避免遗漏连续顺序的情况,这一步的循环设计需仔细权衡终止条件。

你可能感兴趣的:(java,算法,开发语言)