【LeetCode每日一题】【BFS模版与例题】【二维数组】130被围绕的区域 994 腐烂的橘子

前几天写过一篇BFS比较基础版的遍历
【LeetCode每日一题】【BFS模版与例题】863.二叉树中所有距离为 K 的结点

,可以先看一下再看本文

用 BFS 算法遍历二维数组

遍历二维矩阵:二维矩阵中的一个位置看做一个节点,这个节点的上下左右四个位置就是相邻节点。

130 被围绕的区域

在这里插入图片描述

解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的’O’ 都不会被填充为’X’。 任何不在边界上,或不与边界上的’O’ 相连的’O’ 最终都会被填充为’X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

思路:

遍历二维数组,找到边界为‘o’的点,利用BFS非递归框架将与之相连的’o‘都替换为随便一个字母,这里替换’#’。剩下的‘o’就是不与边界连接的 ‘o’。

/*** @param {character[][]} board* @return {void} Do not return anything, modify board in-place instead.*/
var solve = function (board) {let m = board.lengthlet n = board[0].lengthfor (let i = 0; i < m; i++) {for (let j = 0; j < n; j++) {// 从边界的‘o’出发let flag = i === 0 || j === 0 || i === m - 1 || j === n - 1if (flag && board[i][j] === 'O') {bfs(board, i, j)}}}// 对操作后的数组进行刷新。for (let i = 0; i < m; i++) {for (let j = 0; j < n; j++) {// 被包围的,可以去除if (board[i][j] === 'O') {board[i][j] = 'X'}// 边界的,不可以去除,还原回来。if (board[i][j] === '#') {board[i][j] = 'O'}}}return board
}const bfs = (board, i, j) => {let queue = []let visited = new Set()queue.push([i, j])visited.add(`${i},${j}`)while (queue.length > 0) {let [x, y] = queue.shift()board[x][y] = '#'// 向上if (x - 1 >= 0 &&board[x - 1][y] === 'O' &&!visited.has(`${x - 1},${y}`)) {queue.push([x - 1, y])visited.add(`${x - 1},${y}`)}// 向下if (x + 1 < board.length &&board[x + 1][y] === 'O' &&!visited.has(`${x + 1},${y}`)) {queue.push([x + 1, y])visited.add(`${x - 1},${y}`)}// 向左if(y - 1 >= 0 && board[x][y - 1] === 'O' && !visited.has(`${x},${y - 1}`)){queue.push([x, y - 1])visited.add(`${x},${y - 1}`)}// 向右if(y + 1 < board[0].length && board[x][y + 1] === 'O' && !visited.has(`${x},${y + 1}`)){queue.push([x, y + 1])visited.add(`${x},${y + 1}`)}}
}

994 腐烂的橘子

在这里插入图片描述

错误的思路:

遍历二维数组,找到腐烂的橘子,利用这个橘子BFS搜索附近的橘子,记录将连接的橘子变成烂橘子的时间。将二维数组中烂橘子将其他橘子变成烂橘子的时间相加。

错误的题解。

/*** @param {number[][]} grid* @return {number}*/
var orangesRotting = function (grid) {if (!grid.flat().includes(1)) {return 0;}let step = -1;let row = grid.length;let col = grid[0].length;for (let i = 0; i < row; i++) {for (let j = 0; j < col; j++) {if (grid[i][j] == 2) {step += bfs(grid, i, j);}}}if (grid.flat().includes(1)) {return -1;}return step;
};const bfs = (grid, i, j) => {let queue = [[i, j]];let visited = new Set();visited.add(`${i},${j}`);let step = 0;while (queue.length) {let size = queue.length;for (let k = 0; k < size; k++) {let [x, y] = queue.shift();grid[x][y] = 0;// 向上if (x - 1 >= 0 && grid[x - 1][y] == 1 && !visited.has(`${x - 1},${y}`)) {queue.push([x - 1, y]);visited.add(`${x - 1},${y}`);}// 向下if (x + 1 < grid.length &&grid[x + 1][y] == 1 &&!visited.has(`${x + 1},${y}`)) {queue.push([x + 1, y]);visited.add(`${x + 1},${y}`);}// 向左if (y - 1 >= 0 && grid[x][y - 1] == 1 && !visited.has(`${x},${y - 1}`)) {queue.push([x, y - 1]);visited.add(`${x},${y - 1}`);}// 向右if (y + 1 < grid[0].length &&grid[x][y + 1] == 1 &&!visited.has(`${x},${y + 1}`)) {queue.push([x, y + 1]);visited.add(`${x},${y + 1}`);}}step++;}return step;
};

错误的原因:

假如二维数组左上角和右下角分别有一个烂橘子。它们应该能够同时让四周的橘子变烂,而不是先后顺序的。因此,多源的BFS,应该将每个源都放置在queue里面。

var orangesRotting = function (grid) {// 特殊情况:本来就没有新鲜橘子的。if (!grid.flat().includes(1)) {return 0;}let step = -1;let row = grid.length;let col = grid[0].length;let queue = [];let visited = new Set();for (let i = 0; i < row; i++) {for (let j = 0; j < col; j++) {// 多源,每个烂橘子都应该放在queue,他们是属于同一层的。if (grid[i][j] == 2) {queue.push([i, j]);visited.add(`${i},${j}`);}}}step += bfs(grid, queue, visited);// 如果依然剩下新鲜的橘子,说明无法完成,返回-1;if (grid.flat().includes(1)) {return -1;}return step;
};const bfs = (grid, queue, visited) => {let step = 0;while (queue.length) {let size = queue.length;for (let k = 0; k < size; k++) {// 将节点置为0let [x, y] = queue.shift();grid[x][y] = 0;// 向相邻的节点扩散。// 向上if (x - 1 >= 0 && grid[x - 1][y] != 0 && !visited.has(`${x - 1},${y}`)) {queue.push([x - 1, y]);visited.add(`${x - 1},${y}`);}// 向下if (x + 1 < grid.length &&grid[x + 1][y] != 0 &&!visited.has(`${x + 1},${y}`)) {queue.push([x + 1, y]);visited.add(`${x + 1},${y}`);}// 向左if (y - 1 >= 0 && grid[x][y - 1] != 0 && !visited.has(`${x},${y - 1}`)) {queue.push([x, y - 1]);visited.add(`${x},${y - 1}`);}// 向右if (y + 1 < grid[0].length &&grid[x][y + 1] != 0 &&!visited.has(`${x},${y + 1}`)) {queue.push([x, y + 1]);visited.add(`${x},${y + 1}`);}}// 每层遍历完都需要添加1分钟step++;}return step;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/511910.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS2中std_msgs/msg/Header 数据含义及使用

ROS2中std_msgs/msg/Headerr 数据含义及使用 ROS官方消息说明数据说明使用ros2标准的Header案例代码解释测试结果 ROS官方消息说明 ROS2中std_msgs消息包含类型 https://docs.ros2.org/latest/api/std_msgs/msg/std_msgs/msg/Header Message std_msgs/msg/Header数据格式&…

mybatis不重复列插入例子详细说明

之前有做过不重复列插入的需求&#xff0c;当时是 在插入时判断 对应的列在数据库中有没有对应的数据 有则返回false 无则插入&#xff0c;但是这加大了数据库的查询负担 也增加了插入的时间&#xff0c;故今天研究一下 使用sql来简化了这一点 使用的知识点是 daul表 insert i…

紫光展锐T618_4G安卓核心板方案定制

紫光展锐T618核心板是一款采用纯国产化方案的高性能产品&#xff0c;搭载了开放的智能Android操作系统&#xff0c;并集成了4G网络&#xff0c;支持2.5G5G双频WIFI、蓝牙近距离无线传输技术以及GNSS无线定位技术。 展锐T618核心板应用旗舰级 DynamlQ架构 12nm 制程工艺&#x…

3DEXPERIENCE Works八大核心优势分析

云技术正在加速普及&#xff0c;助力各行各业数字化转型。根据IDC 2023年12月发布的报告&#xff0c;2023年全球云计算市场规模达到3329亿美元&#xff0c;同比增长19.4%。其中&#xff0c;公有云市场规模达到2587亿美元&#xff0c;同比增长21.5%;私有云市场规模达到742亿美元…

想要高薪还想要低要求?想转行做Python自动化测试,我该怎么做?

前言 最近小编连续收到好几个粉丝的私信询问&#xff1a;我年纪上来了&#xff0c;原来的行业做不下去了&#xff0c;想转行还能行吗&#xff1f;我是女生&#xff0c;计算机专业快毕业了&#xff0c;但是不喜欢做开发怎么办&#xff1f;我对编程行业感兴趣&#xff0c;想学编…

算法:滑动窗口

文章目录 例题1&#xff1a;长度最小的子数组例题2&#xff1a;无重复字符的最长子串例题3&#xff1a;最大连续1的个数 III例题4&#xff1a;将 x 减到 0 的最小操作数例题5&#xff1a;水果成篮例题6&#xff1a;找到字符串中所有字母异位词例题7&#xff1a;串联所有单词的子…

如何开发分销商城小程序呢_打造分销利器

打造分销利器&#xff0c;揭秘如何开发一款成功的分销商城小程序 在移动互联网时代&#xff0c;小程序以其轻便、快捷的特点&#xff0c;成为了连接用户与服务的桥梁。其中&#xff0c;分销商城小程序更是受到了广大商家的青睐。那么&#xff0c;如何开发一款成功的分销商城小…

IoC底层核心原理与AOP

1.IoC底层核心原理 1.核心接口 BeanFactory 提供bean的基本操作 bean获取 按名称获取 按类型获取 bean供应商 bean基本信息 是否存在 是否单例 类型获取 类型检测&#xff08;类型是否匹配&#xff09; 别名获取 HierarchicalBeanFactory 提供bean分层结构&#xff0c;提出…

【机器学习】生成对抗网络GAN

概述 生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;GAN&#xff09;是一种深度学习模型架构&#xff0c;由生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;两部分组成&#xff0c;旨在通过对抗训练的方式生成逼…

单调栈的理解

单调栈的理解 核心代码场景思考 完整代码环形数组循环数组 单调栈&#xff1a; 单调递增或 单调递减的栈 核心代码 while (!s.empty()&&s.peek()<nums[i]){s.pop(); } s.push(nums[i]);将要放入的元素&#xff0c;与栈内元素依个比较&#xff0c;小于的都出栈&am…

即时设计-高效易用的界面工具

界面工具是设计师的得力助手&#xff0c;为设计师快速创建精美易用的用户界面提供了丰富的功能和直观的界面。在众多的界面工具中&#xff0c;有的支持预设模板、图标库和样式库&#xff0c;有的更注重原型和互动。如何选择优秀的界面工具&#xff1f;这里有一个高效易用的界面…

Latte:一个类似Sora的开源视频生成项目

前段时间OpenAI发布的Sora引起了巨大的轰动&#xff0c;最长可达1分钟的高清连贯视频生成能力秒杀了一众视频生成玩家。因为Sora没有公开发布&#xff0c;网上对Sora的解读翻来覆去就那么多&#xff0c;我也不想像复读机一样再重复一遍了。 本文给大家介绍一个类似Sora的视频生…