思路1: DFS,对于每个门进行一次DFS搜索,记录每个位置对每个门的距离,当有更小距离的门时更新这个数值

    public void WallsAndGates(int[][] rooms) {for (int i = 0; i < rooms.GetLength(0); i++){for (int j = 0; j < rooms[i].GetLength(0); j++){if (rooms[i][j] == 0){DFS(rooms, i, j, 0);}}}        }void DFS(int[][] rooms, int x, int y, int val){if (x < 0 || x >= rooms.GetLength(0))return;if (y < 0 || y >= rooms[x].GetLength(0))return;if (rooms[x][y] < val)return;rooms[x][y] = val;DFS(rooms, x + 1, y, val + 1);DFS(rooms, x, y + 1, val + 1);DFS(rooms, x - 1, y, val + 1);DFS(rooms, x, y - 1, val + 1);}

思路2: 多源BFS,先把每个门都压入队列中,然后进行BFS搜索,BFS搜索保证了每个位置只需要遍历到一次,第一次搜索到时一定是最短距离,因此这种算法对于大量数据时肯定会更优秀

private List<int[]> directions = new List<int[]>(){new int[]{1, 0}, new int[]{-1, 0},new int[]{0, 1},new int[]{0, -1}};
private const int INF = 2147483647;
public void WallsAndGates(int[][] rooms){Queue<int[]> queue = new Queue<int[]>();int maxRow = rooms.GetLength(0);if(maxRow == 0)return;int maxCow = rooms[0].Length;for (int i = 0; i < maxRow; i++){for (int j = 0; j < maxCow; j++){if (rooms[i][j] == 0){queue.Enqueue(new int[]{i,j});}}}while(queue.Count > 0){int[] tile = queue.Dequeue();for(int i = 0; i < directions.Count; i++){int x = tile[0] + directions[i][0];int y = tile[1] + directions[i][1];if(x < 0 || x > maxRow - 1 ||  y < 0 || y > maxCow - 1 || rooms[x][y] != INF){continue;}rooms[x][y] = rooms[tile[0]][tile[1]] + 1;queue.Enqueue(new int[]{x, y});}}     }
}

判题的结果是两者时间差不多太多,都在340ms左右,但是明显在数据量大的情况下应该是多源BFS算法更优秀很多。多源BFS最快是328ms,第一次的704ms是因为用了List没有Queue

LeetCode 286. 墙与门 多源BFS和DFS相关推荐

  1. LeetCode 286. 墙与门(BFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 超时解 2.2 从门开始逆向BFS 1. 题目 你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值: -1 表示墙或是障碍物 0 表 ...

  2. Leetcode 286.墙与门

    Time: 20190902 Type: Medium 解法:BFS 题目描述 你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值: -1 表示墙或是障碍物 0 表示一扇门 INF ...

  3. LC-417. 太平洋大西洋水流问题(多源BFS、DFS)

    417. 太平洋大西洋水流问题 难度中等558 有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻. "太平洋" 处于大陆的左边界和上边界,而 "大西洋&quo ...

  4. 【leetcode】286. 墙与门

    你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值: -1 表示墙或是障碍物 0 表示一扇门 INF 无限表示一个空的房间.然后,我们用 231 - 1 = 2147483647 代 ...

  5. Leetcode286墙与门

    286墙与门 #286墙与门 class Solution:def wallsAndGates(self, rooms):EMPTYROOM = 2**31 - 1door = 0neighbors ...

  6. 第 254 场力扣周赛(KMP、贪心、快速幂、二分+多源bfs、并查集 + 时光倒流)

    第 254 场力扣周赛 稀里糊涂双眼双眼惺忪的做了三道,错了4次...还是600来名 5843. 作为子字符串出现在单词中的字符串数目 题目描述 给你一个字符串数组 patterns 和一个字符串 w ...

  7. 算法提高课-搜索-多源BFS-AcWing 173. 矩阵距离:bfs、多源bfs

    题目分析 来源:acwing 分析: 0表示住户,1表示超市,这些超市是等价的.求每个住户到达超市的最近距离. 多源bfs在做的时候,把所有超市的距离都初始化为0,然后压入队列. 这里用的是数组模拟队 ...

  8. CSP认证201409-4 最优配餐[C++题解]:bfs、多源bfs、最短路、图论

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 有很多起点S,同时有很多终点T,求每个终点到起点中最短的路,只要是到达其中一个起点就行.所以这是一个多源bfs的题目. ac代码 # ...

  9. codeforces1301 F. Super Jaber(多源bfs+枚举)

    F. Super Jaber 最终答案的方案可以分为2种: 不使用传送,即曼哈顿距离. 从起点S到最近(步数最少)的颜色为C的格子x,传送到离终点T最近的颜色也为c的格子y,再走到T(从S到x以及y到 ...

最新文章

  1. 深刻揭示Python 与C/C++互动
  2. Jedis使用总结【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【redis分布式】
  3. 计算机二级Office经验资源分享【一次过关。】
  4. 《剑指offer》-- 回溯法:矩阵中的路径、机器人的运动范围
  5. mysql数据库new和old_数据库触发器中new表和old表是什么意思?
  6. Request.Params用法
  7. 解决朋友圈压缩_朋友中最有趣的朋友[已解决]
  8. 王道考研 计算机网络9 物理层传输介质 双绞线 同轴电缆 光纤
  9. C语言工作笔记-对函数指针的进一步认识(与回调函数结合使用,并且对比C++的回调)
  10. python将对象放入列表根据某个属性排序_关于python:如何根据对象的属性对对象列表进行排序?...
  11. mysql可以登陆sqlyog1862_MySQL错误号码1862:your password has expired
  12. 【iCore4 双核心板_FPGA】例程五:基础逻辑门实验——逻辑门使用
  13. 定时器计数器工作方式
  14. halcon视觉框架源码_图像处理与机器视觉初学者学习路线
  15. 易达项目的工作进程第二天
  16. a4如何打印双面小册子_a4如何排版打印双面小册子?
  17. Vivado使用记录(二)下载与固化
  18. 为linux下ibus添加五笔98输入法过程详解
  19. 华为桌面小程序在哪里_微信Windows版更新至3.0:批量管理联系人,小程序可添加至桌面...
  20. java兔子繁殖_兔子繁衍问题 (考虑死亡)

热门文章

  1. python中函数定义可以不包括什么_Python 中,函数定义可以不包括以下_______。
  2. python数据类型可变和不可变_Python——可变和不可变类型数据
  3. Web UI⾃动化测试平台,专治Web 的各种疑难杂症。
  4. 计算机软件侵权责任,对计算机软件侵权行为认定标准
  5. java添加容器_如何为Java应用程序构建docker容器
  6. Appleman and Tree CodeForces - 461B(树形dp)
  7. CST 使用注意事项【持续更新】
  8. android px pd sp区别,【求助】我用北京索莱宝质粒小量提取试剂盒提的质粒,电泳图...
  9. kmeans算法_实战 | KMeans 聚类算法
  10. 『设计模式』我能进来坐坐吗?--访问者模式