• 01BFS2290. 到达角落需要移除障碍物的最小数目


    2022-06-11 21:07:12

    问题描述:

    给你一个下标从 0 开始的二维整数数组 grid ,数组大小为 m x n 。每个单元格都是两个值之一:

    0 表示一个 空 单元格,
    1 表示一个可以移除的 障碍物 。
    你可以向上、下、左、右移动,从一个空单元格移动到另一个空单元格。

    现在你需要从左上角 (0, 0) 移动到右下角 (m - 1, n - 1) ,返回需要移除的障碍物的 最小 数目。

    示例 1:

    输入:grid = [[0,1,1],[1,1,0],[1,1,0]]
    输出:2
    解释:可以移除位于 (0, 1) 和 (0, 2) 的障碍物来创建从 (0, 0) 到 (2, 2) 的路径。
    可以证明我们至少需要移除两个障碍物,所以返回 2 。
    注意,可能存在其他方式来移除 2 个障碍物,创建出可行的路径。
    示例 2:

    输入:grid = [[0,1,0,0,0],[0,1,0,1,0],[0,0,0,1,0]]
    输出:0
    解释:不移除任何障碍物就能从 (0, 0) 到 (2, 4) ,所以返回 0 。

    提示:

    m == grid.length
    n == grid[i].length
    1 <= m, n <= 105
    2 <= m * n <= 105
    grid[i][j] 为 0 或 1
    grid[0][0] == grid[m - 1][n - 1] == 0

    问题求解:

    经典的01bfs模版题,需要注意的是python中不能用list来模型queue,需要用deque,否则会超时。

    class Solution:
        def minimumObstacles(self, grid: List[List[int]]) -> int:
            n = len(grid)
            m = len(grid[0])
            ds = [[-1, 0], [1, 0], [0, 1], [0, -1]]
            q = deque()
            used = set()
            q.append([0, 0, 0])
            while q:
                x, y, cost = q.popleft()
                if x * m + y in used:
                    continue
                used.add(x * m + y)
                if x == n - 1 and y == m - 1:
                    return cost
                for d in ds:
                    nx = x + d[0]
                    ny = y + d[1]
                    if nx < 0 or nx >= n or ny < 0 or ny >= m or nx * m + ny in used:
                        continue
                    if grid[nx][ny] == 1:
                        q.append([nx, ny, cost + 1])
                    else:
                        q.appendleft([nx, ny, cost])
            return -1
    

      

  • 相关阅读:
    团队个人冲刺day08
    4.26 jQuery AJAX load() 方法
    4.23 jquery
    4.22 AJAX技术
    4.21 正则表达式
    4.20
    4.15 重写团队作业1
    4.12 重写团队作业1
    4.9 团队作业1
    4.7 团队作业1
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/16366811.html
Copyright © 2020-2023  润新知