Leetcode 286.墙与门
Time: 20190902
Type: Medium
解法:BFS
题目描述
你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值:
-1 表示墙或是障碍物
0 表示一扇门
INF 无限表示一个空的房间。然后,我们用 231 - 1 = 2147483647 代表 INF。你可以认为通往门的距离总是小于 2147483647 的。
你要给每个空房间位上填上该房间到 最近 门的距离,如果无法到达门,则填 INF 即可。
示例:
给定二维网格:
INF -1 0 INF
INF INF INF -1
INF -1 INF -10 -1 INF INF
运行完你的函数后,该网格应该变成:
3 -1 0 12 2 1 -11 -1 2 -10 -1 3 4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/walls-and-gates
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
从门开始宽度优先搜索,环一层一层扩散,能被门的光环覆盖到的时候,就是距离门的最短距离。
这非常直接。
前面写题快有一种思维定式是,只有DFS才有上下左右四个探索,其实BFS也一样可以有递归的写法。
要灵活掌握算法背后的思想。本题用BFS的解法是最简单易懂的。
代码
class Solution:def wallsAndGates(self, rooms: List[List[int]]) -> None:"""Do not return anything, modify rooms in-place instead."""if not rooms or len(rooms) == 0:return row = len(rooms)col = len(rooms[0])def bfs(rooms, i, j, val): # val表示环扩展的距离nonlocal row, colif i < 0 or i >= row or j < 0 or j >= col:returnif rooms[i][j] < val: # 如果当前位置已经找到更近的门了,直接返回returnrooms[i][j] = valbfs(rooms, i + 1, j, val + 1)bfs(rooms, i, j + 1, val + 1)bfs(rooms, i - 1, j, val + 1)bfs(rooms, i, j - 1, val + 1)for i in range(row):for j in range(col):if rooms[i][j] == 0:bfs(rooms, i, j, 0)
BFS递归函数带着的val
表示当前环向外扩展的距离,每次进入下一层递归时,表示环向外扩散一层,则val + 1
。
比较有意思的是,rooms[i][j]
表示当前点到门的距离,如果本身是-1,则表示不用更新,且会挡住继续探索的路径。
如果是INF,且能遍历到这里来,直接更新为val
值。
相似的习题
Leetcode 317.离建筑物最近的距离 Hard
Leetcode 489.扫地机器人 Hard
Leetcode 994.腐烂的橘子 Easy
END.
Leetcode 286.墙与门相关推荐
- LeetCode 286. 墙与门(BFS)
文章目录 1. 题目 2. 解题 2.1 BFS 超时解 2.2 从门开始逆向BFS 1. 题目 你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值: -1 表示墙或是障碍物 0 表 ...
- LeetCode 286. 墙与门 多源BFS和DFS
思路1: DFS,对于每个门进行一次DFS搜索,记录每个位置对每个门的距离,当有更小距离的门时更新这个数值 public void WallsAndGates(int[][] rooms) {for ...
- 【leetcode】286. 墙与门
你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值: -1 表示墙或是障碍物 0 表示一扇门 INF 无限表示一个空的房间.然后,我们用 231 - 1 = 2147483647 代 ...
- Leetcode286墙与门
286墙与门 #286墙与门 class Solution:def wallsAndGates(self, rooms):EMPTYROOM = 2**31 - 1door = 0neighbors ...
- 【LeetCode - 286】墙与门
文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解题思路 首先把所有的门的坐标入队. 当队列不为空,则进行一下操作: 1.取出一个坐标点 (x, y): 2.遍历 ...
- 【LeetCode286】墙与门(BFS)
一.题目 给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值: -1 表示墙或是障碍物 0 表示一扇门 INF 无限表示一个空的房间.然后,我们用 2 31 2^{31} 231 - 1 ...
- LeetCode 286 Walls and Gates
思路 思路1:暴力搜索,对每个空房间(INF)进行bfs,不过此时的bfs应该是每次向队列中加下一层的元素而不是单个元素,否则深度会算错. 时间复杂度O(n2∗m2n^2 * m^2n2∗m2), 空 ...
- leetcode 286 周赛回顾
T1 传送门 比赛时代码,过于冗长 class Solution { public:vector<vector<int>> findDifference(vector<i ...
- Leetcode 200.岛屿数量
Time: 20190902 Type: Medium 题目描述 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地 ...
最新文章
- mysql二进制还原表_MYSQL 二进制还原
- 《Node.js入门》Windows 7下Node.js Web开发环境搭建笔记
- 黑客大佬:我是如何让50个文件一起骗过AI安防系统的?
- 【树形DP】 HDU 2196 Computer
- python numpy逆_Python使用numpy计算矩阵特征值、特征向量与逆矩阵
- java环境变量配置 - win10
- pda连接电脑无法存取文件_手机无法连接电脑怎办
- 怎么禁止浏览器自动保存密码?
- 云服务器 ECS > 块存储 > 块存储介绍 > 块存储概述 请输入关键词
- java方法synchronized_java synchronized方法 – 它是如何工作的
- 文章根据时间段显示的微信名和微信号
- 3DMAX卸载/完美解决安装失败/如何彻底卸载清除干净3DMAX各种残留注册表和文件的方法
- 八爪鱼数据采集教程(一)
- Qt开发——图片缩放简述
- ubuntu NFS SCP SFTP
- 电脑公司 GHOST WIN10 X64 装机专业版 V2018.04(64位)
- python量化期权_Python量化期权怎么学?
- Unity3d代码及效率优化总结
- django 下载安装xadmin(django3.x + python3.6+xadmin2.x)
- URL如何转换成pdf?
热门文章
- ROS Image_transport使用
- 机器学习:单变量线性回归及梯度下降
- c语言三种循环语句,C语言三种循环语句的功能等价性
- 程序员操作系统推荐_程序员的这些问题,竟然在工作后才发现!
- python源码不需要编译成二进制代码_编译 Python 源代码
- 佳能7200cdn打印自检_家用打印机如何挑选? 家用打印机性价比较高的有哪些?...
- python怎么索引txt数据中第四行_python-在熊猫数据框中按行计数编制索引
- java 异步程序,java异步编程
- mysql5.6 多实例 主从安装_MySQL5.6一主多从的半同步复制实例
- java 方法调用表达式_java lambda怎么表达式判断被调用接口名称和接口中方法