📌  相关文章
📜  将两个岛屿连接成网格的最小水陆转换次数 |设置 2(1)

📅  最后修改于: 2023-12-03 14:53:46.689000             🧑  作者: Mango

将两个岛屿连接成网格的最小水陆转换次数 | 设置 2

简介

本题是一个典型的图论问题,要求将两个岛屿通过最小次数的水陆转换连接成一个网格。题目要求限制每次转换的类型并且限制转换次数不超过2次。

通过解题,我们需要使用图的遍历和计算最短路径的算法,如广度优先搜索(BFS)。

解题思路
  1. 将两个岛屿视为两个节点,我们需要找到两个节点之间的最小路径。
  2. 使用BFS算法对两个节点之间的最短路径进行计算。
  3. 在BFS算法中,我们需要将网格视为一个图,其中节点是网格上的每个单元格,边表示两个相邻单元格之间存在一条路径(陆地或水域)。
  4. 我们可以使用一个队列来实现BFS。从一个岛屿的节点开始,将其加入队列中,然后迭代地出队当前节点,并将其相邻的未访问过的节点入队,并使用一个距离数组来记录当前节点与起始节点之间的距离。
  5. 在访问相邻节点时,我们需要检查当前节点和相邻节点之间的路径类型,如果符合题目要求,则将相邻节点加入队列中,并更新距离数组的值。
  6. 重复执行步骤5直到队列为空或找到终点节点(另一个岛屿的节点)。
  7. 最后,我们返回距离数组中终点节点的值作为最小水陆转换次数。
代码示例
from collections import deque

def min_land_water_transform(grid):
    # 获取网格的行数和列数
    rows, cols = len(grid), len(grid[0])
    
    # 定义上、下、左、右四个方向的偏移量
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
    
    # 定义一个队列用于BFS
    queue = deque()
    
    # 定义一个距离数组用于记录节点之间的最小距离
    distances = [[float('inf')] * cols for _ in range(rows)]
    
    # 将两个岛屿的节点入队并更新距离数组的值
    def enqueue(row, col, distance):
        queue.append((row, col))
        distances[row][col] = distance
    
    # 从起始节点开始BFS
    enqueue(0, 0, 0)
    
    # 开始BFS
    while queue:
        row, col = queue.popleft()
        
        # 当前节点的距离加1
        distance = distances[row][col] + 1
        
        # 遍历四个方向上的相邻节点
        for drow, dcol in directions:
            nrow, ncol = row + drow, col + dcol
            
            # 如果相邻节点在网格范围内,并且未被访问过
            if 0 <= nrow < rows and 0 <= ncol < cols and distances[nrow][ncol] == float('inf'):
                # 如果相邻节点为陆地,则将其入队并更新距离数组的值
                if grid[nrow][ncol] == 1:
                    enqueue(nrow, ncol, distance)
                # 如果相邻节点为水域,并且已经进行了一次水陆转换
                # 则将其入队并更新距离数组的值,但距离加2,表示进行了两次水陆转换
                elif distance < 2:
                    enqueue(nrow, ncol, distance + 1)
    
    # 返回终点节点的距离作为最小水陆转换次数
    return distances[rows - 1][cols - 1]
复杂度分析
  • 时间复杂度:O(M * N),其中 M 和 N 分别是网格的行数和列数。在最坏的情况下,我们需要遍历每个单元格一次。
  • 空间复杂度:O(M * N),我们需要使用一个队列和一个距离数组来进行BFS。同时,如果使用一个标记数组来记录节点是否已经被访问过,空间复杂度则为 O(M * N)。