You are given a m x n 2D grid initialized with these three possible values.

  1. -1 - A wall or an obstacle.
  2. 0 - A gate.
  3. INF - Infinity means an empty room. We use the value 231 - 1 = 2147483647 to represent INF as you may assume that the distance to a gate is less than 2147483647.

Fill each empty room with the distance to its nearest gate. If it is impossible to reach a gate, it should be filled with INF.

Example:

Given the 2D grid:

INF  -1  0  INF
INF INF INF -1
INF -1 INF -1
0 -1 INF INF

After running your function, the 2D grid should be:

  3  -1   0   1
2 2 1 -1
1 -1 2 -1
0 -1 3 4 这个题目是用BFS来解决, 最naive approach就是扫每个点,然后针对每个点用BFS一旦找到0, 代替点的值. 时间复杂度为 O((m*n)^2);
我们还是用BFS的思路, 但是我们先把2D arr 扫一遍, 然后把是0的位置都append进入queue里面, 因为是BFS, 所以每一层最靠近0的位置都会被替换, 并且标记为visited, 然后一直BFS到最后即可.
时间复杂度降为O(m*n) 1. Constraints
1) empty or len(rooms[0]) == 0, edge case
2) size of the rooms < inf
3) 每个元素的值为0, -1, inf 2. Ideas BFS T: O(m*n) S: O(m*n) 1) edge case,empty or len(rooms[0]) == 0 => return
2) scan 2D arr, 将值为0 的append进入queue里面
3) BFS, 如果是not visited过得, 并且 != 0 or -1, 更改值为dis + 1, 另外append进入queue, add进入visited 3. Code
 class Solution:
def wallAndGates(self, rooms):
if not rooms or len(rooms[0]) == 0: return
queue, lr, lc, visited, dirs = collections.deque(), len(rooms), len(rooms[0]), set(), [(1, 0), (-1, 0), (0, 1), (0, -1)]
for i in range(lr):
for j in range(lc):
if rooms[i][j] == 0:
queue.append((i, j, 0))
visited.add((i, j)) while queue:
pr, pc, dis = queue.popleft()
for d1, d2 in dirs:
nr, nc = pr + d1, pc + d2
if 0<= nr < lr and 0<= nc < lc and (nr, nc) not in visited and rooms[nr][nc] != -1:
rooms[nr][nc] = dis + 1
queue.append((nr,nc, dis + 1))
visited.add((nr, nc))

4. Test cases

1) edge case

2)

INF  -1  0  INF
INF INF INF -1
INF -1 INF -1
0 -1 INF INF

After running function, the 2D grid should be:

  3  -1   0   1
2 2 1 -1
1 -1 2 -1
0 -1 3 4

最新文章

  1. magento事件(event)的dispatchEvent(分发)和catchEvent(获取)
  2. 【翻译】如何给tomcat配置memcached-session-manager
  3. WebApi 通过类名获取类并实例化
  4. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结
  5. Java面试宝典答案详解与感悟(第二天)
  6. LiveWriter Test
  7. 使用mvc3实现ajax跨域
  8. JavaWeb学习总结(四)—ServletConfig和ServletContext
  9. J2EE 第二阶段项目之编写代码(六)
  10. 基于XMPP的即时通信系统的建立(四)— 协议详解
  11. hibernate 数据行数统计 count(*)
  12. PC寄存器的真实状态
  13. Sql Server批量停止作业
  14. css-文本及其他
  15. ES6 新增命令
  16. 【C#复习总结】匿名类型由来
  17. Tensorflow 大规模数据集训练方法
  18. 用python脚本获取运行环境中的module 列表
  19. Windows10 VS2017 C++编译Linux程序
  20. 【2017-04-20】Sql字符串注入式攻击与防御,实体类,数据访问类

热门文章

  1. Android studio Unable to start the daemon process
  2. Sencha Touch 实战开发培训 视频教程 第二期 第四节
  3. CF 1100E Andrew and Taxi(二分答案)
  4. vscode的vetur插件提示 [vue-language-server] Elements in iteration expect to have &#39;v-bind:key&#39; directives错误的解决办法
  5. Linux 修改文件和文件夹权限
  6. TX失败策略2
  7. http模拟登陆及发请求
  8. thinkphp---设置路由
  9. HTML表单的运用
  10. HOJ 2133&POJ 2964 Tourist(动态规划)