62课| 豆包MarsCode AI刷题

118 阅读3分钟

笔记如下:

问题理解

这个问题可以看作是一个广度优先搜索(BFS)的变种问题。我们需要计算病毒从一个初始感染者开始,传播到整个房间内所有人的最短时间。房间是一个二维网格,每个座位上的人可能戴口罩也可能不戴口罩。戴口罩的人需要更长的时间才能被感染。

数据结构选择

  1. 二维网格(seats) :表示房间的座位布局,其中 0 表示戴口罩的人,1 表示未戴口罩的人。
  2. 队列(queue) :用于BFS,存储当前时间步内所有被感染的座位。
  3. 访问标记(visited) :记录每个座位是否已经被感染,避免重复处理。

算法步骤

  1. 初始化

    • 将初始感染者的位置加入队列,并标记为已访问。
    • 记录当前时间步为0。
  2. BFS循环

    • 从队列中取出当前时间步的所有感染者。

    • 对于每个感染者,检查其四个相邻座位(上、下、左、右)。

    • 如果相邻座位上的人未戴口罩(值为1),则立即感染,并将其加入队列。

    • 如果相邻座位上的人戴口罩(值为0),则需要额外的时间才能感染。

      • 如果当前时间步是偶数,则需要等待到下一个时间步才能感染。
      • 如果当前时间步是奇数,则需要等待到下下个时间步才能感染。
    • 更新时间步,并继续循环,直到队列为空。

  3. 终止条件

    • 当队列为空时,表示所有可能被感染的座位都已经被处理。
    • 返回当前时间步作为结果。

收获总结

通过解决这个问题,我们可以学到以下几点:

  1. 广度优先搜索(BFS)的应用

    • BFS是一种非常适合解决最短路径问题的算法。在这个问题中,我们使用BFS来计算病毒传播到所有人的最短时间。
    • BFS通过逐层扩展的方式,确保我们能够找到最短的路径。
  2. 多源BFS

    • 在这个问题中,初始感染者可以看作是BFS的多个起始点。我们可以将所有初始感染者同时加入队列,从而实现多源BFS。
  3. 状态管理

    • 在BFS中,我们需要管理每个节点的状态(是否被访问过),以避免重复处理。
    • 在这个问题中,我们使用一个二维数组来记录每个座位的感染状态。
  4. 时间复杂度的优化

    • 通过合理选择数据结构和算法,我们可以优化时间复杂度。在这个问题中,BFS的时间复杂度为O(n * m),其中n和m分别是行数和列数。
  5. 边界条件的处理

    • 在处理二维网格问题时,我们需要特别注意边界条件的处理。例如,在检查相邻座位时,需要确保不越界。
  6. 问题的抽象与建模

    • 将实际问题抽象为图论问题,并选择合适的算法来解决,是解决复杂问题的关键。在这个问题中,我们将房间的座位布局抽象为一个二维网格,并使用BFS来解决病毒传播问题。

通过了此次的刷题和笔记总结,我收获满满 相信自己的努力一定不会白费的