Leecode第九天,广度优先搜索之矩阵,腐烂的橘子
第九天,两个广度优先搜索的算法题,先来看第一个
乍一看没有头绪,那我们先简化一下题目,假如只有一个0,那问题是不是很简单,以唯一的0作为中心做广度优先搜索,设个变量depth,每搜索一层,depth+1。简单解决。
那么现在有多个0,好了,有点复杂,但是换一下思维,把多个0看成“超级0”辐射而来的就轻松解决了,现在题目变成这样:有一个超级0,其他都是1,算出每个1到超级0的距离。但是超级0做广度优先搜索的第一层辐射创造出了多个0,逻辑关系不需要写,现在需要笔者继续完成剩下的广度优先搜索。好的,太简单了,将多个0放进队列,继续做广度优先搜索不OK了吗?看代码
class Solution {static int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int[][] updateMatrix(int[][] matrix) {//新建大小一样的矩阵int m = matrix.length, n = matrix[0].length;int[][] dist = new int[m][n];//新建boolean类型数组标记 节点是否访问过boolean[][] seen = new boolean[m][n];//新建队列放入节点Queue<int[]> queue = new LinkedList<int[]>();// 将所有的 0 添加进初始队列中for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (matrix[i][j] == 0) {queue.offer(new int[]{i, j});seen[i][j] = true;}}}// 广度优先搜索while (!queue.isEmpty()) {int[] cell = queue.poll();int i = cell[0], j = cell[1];for (int d = 0; d < 4; ++d) {int ni = i + dirs[d][0];int nj = j + dirs[d][1];if (ni >= 0 && ni < m && nj >= 0 && nj < n && !seen[ni][nj]) {dist[ni][nj] = dist[i][j] + 1;queue.offer(new int[]{ni, nj});seen[ni][nj] = true;}}}return dist;}
}
第二题 腐烂的橘子
刚开始看到这题目,觉得和第一题很相似,只不过最后多个判断有没有全部腐烂而已,见代码
class Solution {int[] dx = new int[]{1,0,0,-1};int[] dy = new int[]{0,1,-1,0};/*** bfs* 找到所有腐烂的橘子加入队列中, 并统计新鲜水果数量* 从腐烂橘子位置开始, dfs迭代, 完成*/public int orangesRotting(int[][] grid) {int m = grid.length;int n = grid[0].length;int time = 0;//找到所有腐烂的橘子加入队列中, 并统计新鲜水果数量int normalCount = 0;Queue<int[]> queue = new LinkedList<>();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (grid[i][j] == 2){queue.add(new int[]{i, j});} else if(grid[i][j] == 1){normalCount++;}}}//没有烂橘子if (normalCount == 0){return 0;}//猎杀时刻while (!queue.isEmpty()){int size = queue.size();for (int i = 0; i < size; i++) {int[] point = queue.poll();int row = point[0];int column = point[1];for (int j = 0; j < dx.length; j++) {int x = row + dx[j];int y = column + dy[j];if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1){//好橘子烂掉grid[x][y] = 2;normalCount--;queue.add(new int[]{x,y});}}}time++;}return normalCount == 0 ? time -1 : -1;}
}
Leecode第九天,广度优先搜索之矩阵,腐烂的橘子相关推荐
- Leetcode广度优先搜索笔记2 腐烂的橘子
994. 腐烂的橘子:带有变量控制的矩阵中的广度优先搜索 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格: 值 1 代表新鲜橘子: 值 2 代表腐烂的 ...
- 【BFS 广度优先搜索】详解感染橘子最短时间问题
一.题目描述 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格: 值 1 代表新鲜橘子: 值 2 代表腐烂的橘子. 每分钟,腐烂的橘子 周围 4 个方向 ...
- 【广度优先搜索】leetcode 994. 腐烂的橘子
994. 腐烂的橘子 文章目录 题目描述 示例1: 示例2: 示例3: 提示 方法:多源广度优先搜索 解题思路 代码 复杂度分析 题目描述 在给定的 m x n 网格 grid 中,每个单元格可以有以 ...
- 腐烂的橘子(广度优先搜索)(考虑同时搜索)
题目994. 腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格: 值 1 代表新鲜橘子: 值 2 代表腐烂的橘子. 每分钟,腐烂的橘子 周围 ...
- C++编程-腐烂的橘子-广度优先搜索
题目: 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格: 值 1 代表新鲜橘子: 值 2 代表腐烂的橘子. 每分钟,腐烂的橘子 周围 4 个方向上相邻 ...
- 广度优先搜索c语言矩阵,算法7-6:图的遍历——广度优先搜索 (C++代码)
解题思路: 首先要开一个二维数组储存邻接矩阵,一般的方法是开一个足够大的数组,例如这道题是n不大于50,不过这样做会造成空间不必要的浪费.因此手动分配空间会更为合理.一种方法是用malloc,对应销毁 ...
- 单源广度优先搜索 (leetcode经典例题 C++实现)
文章目录 01矩阵 地图分析 腐烂的橘子 深度优先搜索与广度优先搜索前情回顾: 深度搜索dfs与广度搜索bfs算法总结(c++ 例题) 本节是广度优先搜索的进阶: 01矩阵 传送门: https:// ...
- 力扣入门级广度优先搜索/遍历刷题小结
刷这些题时死掉的脑细胞是我当年在<线性代数>和<概率论与数理统计>课上没学明白时苟活下来的( 这几题基本是抄作业了,但我发现官方题解写的也很绕,都不知道是我天然看到这类题就头晕 ...
- 广度优先搜索BFS进阶(一):多源BFS、优先队列BFS、双端队列BFS
一.多源BFS 在上一篇博客:广度优先搜索BFS基础中,我们接触到的BFS均是单起点(单源)的,但是对于某一些问题,其有多个起点,此类问题我们称为多源BFS问题.先思考下面一道例题: 1.腐烂的橘子 ...
最新文章
- English trip M1 - AC6 How to make salad? Teacher:Patrick
- 【AutoML】强化学习如何用于自动模型设计(NAS)与优化?
- egret:什么是脏矩形
- RMQ求区间最值 nlog(n)
- 项目助理这个工作怎么样_分析微信清理僵尸粉这个项目怎么样?
- UVA516 POJ1365 LA5533 ZOJ1261 Prime Land【欧拉筛法】
- 在vpc 2007上安装 ubuntu8.04-desktop(多图解)(转)
- overflow解决float浮动后高度自适应问题
- 网络掘金者信息采集软件行业应用
- 可以在树莓派上使用的交互式抠图软件
- win7远程桌面连接问题解决方案
- 微信协议简单调研笔记 (2)
- 工作中遇到的发送报警短信的流程图设计
- 微博立场检测 60分Baseline
- 普通人如何在5年内赚到1000万
- 全国计算机等级考试Java上机真题
- SLAM——ORB-SLAM3代码分析(七)Converter
- 信息安全技术之08之设备与环境安全测试卷
- 金山发布毒霸V及网镖V新品 坚持高定价策略
- 爬取CSDN官方博客粉丝中码龄20年以上的用户数量