算法BFS经典例题(迷宫,多源BFS,BFS解决拓扑排序,FloodFill算法)

目录

力扣733.图像渲染

力扣200.岛屿数量

力扣695岛屿最大面积

力扣130.被围绕的区域(微难)


 int[2][3]

力扣733.图像渲染

FloodFill算法

洪水灌溉

广度优先遍历的本质就是暴力遍历  把所有的结果都走一遍(具体说怎么走的方向没有谈及,说是二叉树遍历,但是实际上也就是一层全部走完,并没有什么特定的规律说是往哪里走完)

class Solution {int[]dx={0,0,1,-1};int[]dy={1,-1,0,0};public int[][] floodFill(int[][] image, int sr, int sc, int color) {int prev=image[sr][sc];if(prev==color) return image;//m是横着的下标和,n是竖着的下标和int m=image.length,n=image[0].length;Queue<int[]>q=new LinkedList<>();//把初始两个下标放到了数组里面,然后队列add的是这个数组q.add(new int[]{sr,sc});while(!q.isEmpty()){//取出队列的开头int []t=q.poll;//a,b表示的是取出来的下标int a=t[0],b=t[1];image[a][b]=color;//为什么是小于4因为对应的是4个方向for(int i=0;i<4;i++){int x=a+dx[i],y=b+dy[i];//看他越不越界,并且看他是否和目标元素相同,而且因为我们是边遍历,边去修改,所以最开始的值是发生变化了,所以不回再次进入循环if(x>=0&&x<m&&y<n&&image[x][y]==prev){//把符合要求数值下标加入队列里面,然后q.add(new int[]{x,y});}}}return image;}
}

力扣200.岛屿数量

1.直接修改原数组

2.vis[m][n]实施标记,在原先的数组情况下,给予一层标记,遍历过的使用true;

这里比较难的地方是他的代码编写,思想其实挺好理解,存下标,用一个队列存储,然后看是不是你要的(唯一比较难的根据题意,上一道题是找相同的数,这个题意很清晰,但是这道题是要找所谓的“岛屿”,这也需要你理解这个所谓的岛屿什么的究竟是什么意思,这道题,他的岛屿的含义就是把周围的一圈是陆地的都标记了,假如说周围是水,那么不耽误,假如周围不是全是水,那么把他上下左右标记一圈,到达下一个然后看扫描你的上下左右,看你的上下左右有没有也是岛屿的,假如遇到标记的就跳过。

生活思维:岛屿是被水包围的,总想是围棋一样,我们未培养起来编程思维,就感觉不知道从何下手

但是编程思维,就是先把一圈走了,看看上下左右的分布,是陆地的标记,他能把从第一个开始到不是这块的,都统计为一个,然后是水的就不标记,直接跳过,直到再找到一块岛屿,在遍历他的周围,周围没有的话,就再加一以此反复。

class Solution {int[]dx={0,0,1,-1};int[]dy={1,-1,0,0};boolean[][] vis=new boolean[301][301];int m,n;public int numIslands(char[][] grid) {m=grid.length;n=grid[0].length;int ret=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if (grid[i][j]=='1'&&vis[i][j]==false){ret++;bfs(grid,i,j);}}}return ret;}public void bfs(char[][]grid,int i,int j){//在q里和那个图像渲染一样,在q里加入初始位置的下标Queue<int[]>q=new LinkedList<>();q.add(new int[]{i,j});vis[i][j]=true;while(!q.isEmpty()){int[]t=q.poll();int a=t[0],b=t[1];for(int k=0;k<4;k++){int x=a+dx[k],y=b+dy[k];if(x>=0&& x<m&& y>=0&& y<n&&grid[x][y]=='1' && vis[x][y]==false){q.add(new int[]{x,y});vis[x][y]=true;  }} }}
}

力扣695岛屿最大面积

class Solution {int[]dx={0,0,1,-1};int[]dy={1,-1,0,0};int sum=0;int m,n;boolean[][]vis=new boolean[51][51];public int maxAreaOfIsland(int[][] grid) {m=grid.length;n=grid[0].length;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]==1&&vis[i][j]==false)sum=Math.max(sum,bfs(grid,i,j));}}
return sum;}public int bfs(int[][]grid,int i,int j){int count=0;Queue<int[]>q=new LinkedList<>();q.add(new int[]{i,j});vis[i][j]=true;count++;while(!q.isEmpty()){int[]t=q.poll();int a=t[0];     int b=t[1];for(int k=0;k<4;k++){int x=a+dx[k];int y=b+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&vis[x][y]==false&&grid[x][y]==1){        q.add(new int[]{x,y});count++;vis[x][y]=true;}}}return count;}}

力扣130.被围绕的区域(微难)

恶补二维数组知识

 

为神马说他微难呢?是因为当我们想用套模版莽夫做这个题,会发现一个问题,就是他怎么判断是否被包围,我们之前的都是边判断边修改,这个需要你看一圈之后,才判断是否需要修改。

解法:正难则反:先去把周围都给处理改成一个点,不影响判断的,只要把四边相邻的处理(这些事不被包围的)然后再去扫描矩阵,然后再去恢复成O

注意:小细节,这道题不需要统计xx数量,所以不需要我们搞一个boolean去标记

此外,这个题的正难则反,是bfs也去用来扫描矩阵,而中间的都是被包围的,所以不需要做处理,只需要都遍历的时候,把中间的一圈改成x,因为未被包围的我们都改成.了,所以不会影响我们操作,最后把.换回X即可

class Solution {int[]dx={0,0,1,-1};int[]dy={1,-1,0,0};int m,n;public void solve(char[][] board) {m=board.length;n=board[0].length;for(int i=0;i<m;i++){if(board[i][0]=='O')bfs(board,i,0);if(board[i][n-1]=='O')bfs(board,i,n-1);}for(int j=0;j<n;j++){if(board[0][j]=='O')bfs(board,0,j);if(board[m-1][j]=='O')bfs(board,m-1,j);}for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(board[i][j]=='O')board[i][j]='X';else if(board[i][j]=='.')board[i][j]='O';}}}public void bfs(char[][]board,int i,int j){Queue<int[]>q=new LinkedList<>();q.add(new int[]{i,j});board[i][j]='.';while(!q.isEmpty()){int[]t=q.poll();int a=t[0];int b=t[1];for(int k=0;k<4;k++){int x=a+dx[k];int y=b+dy[k];if(x>0&&x<m-1&&y>0&&y<n-1&&board[x][y]=='O'){q.add(new int[]{x,y});board[x][y]='.';  }}   }}
}

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

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

相关文章

在 Room 数据库中使用事务处理联表操作

首先是错误版本的相关代码内容&#xff1a; Event.kt: import androidx.room.Entity import androidx.room.PrimaryKeyEntity(tableName "events") data class Event(val title: String,val description: String,val timestamp: Long,PrimaryKey(autoGenerate tr…

Linux下性能分析的可视化图表工具

1 sar 和sadf 1.1 简介 sar命令可以记录系统下的常见活动信息&#xff0c;例如CPU使用率、网络统计数据、Block I/O数据、内存使用情况 等。 sar命令的“-o [file_name]”参数可以将系统活动数据记录到file_name文件&#xff0c;然后通过sadf来解析&#xff0c;sadf命令的“-g…

SpringMVC 学习(八)之文件上传与下载

目录 1 文件上传 2 文件下载 1 文件上传 SpringMVC 对文件的上传做了很好的封装&#xff0c;提供了两种解析器。 CommonsMultipartResolver&#xff1a;兼容性较好&#xff0c;可以兼容 Servlet3.0 之前的版本&#xff0c;但是它依赖了 commons-fileupload …

CW023A-H035 CW023A-R230铜合金硬度材质书

CW023A-H035 CW023A-R230铜合金硬度材质书C2100W-O、C2680TWS-OL、C2200W-1/2H、C2800TS-O 、C2800T-H、C2800T-1/2H、C2700TS-O、C4430T-O、C2700T-O、C2700T-H、C2700T-OL、C2800TS-1/2H、C2800T-OL、C2700-O、C2800TS-H、C2700-H、C2700T-1/2H、C2600TS-1/2H、C2700-1/2H、C…

1817735-38-8,羧基五 PEG5 磺酸,含有羧酸和磺酸的PEG连接剂

1817735-38-8&#xff0c;Carboxy-PEG5-sulfonic acid&#xff0c;羧基五聚乙二醇磺酸&#xff0c;羧基五 PEG5 磺酸&#xff0c;含有羧酸和磺酸的PEG连接剂&#xff0c;可以进行酯化反应 您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;1817735-38-8&#xff0c;…

鸿蒙媒体开发【简述】

媒体系统架构 媒体系统提供用户视觉、听觉信息的处理能力&#xff0c;如音视频信息的采集、压缩存储、解压播放等。在操作系统实现中&#xff0c;通常基于不同的媒体信息处理内容&#xff0c;将媒体划分为不同的模块&#xff0c;包括&#xff1a;音频、视频&#xff08;也称播…

pycharm配置环境出现unsupported

情况概述&#xff1a; 本人电脑中的pycharm版本是2019的&#xff0c;在使用python3.10环境的时候&#xff0c;pycharm无法识别&#xff0c;出现如下错误&#xff1a; 网上说是因为python版本过高&#xff0c;无法兼容低版本的pycharm&#xff0c;解决方案分两种&#xff1a;要…

js中和Vue中的事件委托(事件代理)的实现方法

目录 一、事件委托&#xff08;事件代理&#xff09; 1、事件委托的优点 2、事件委托的缺点 3、为什么要使用事件委托 4、事件委托实现原理 5、DOM事件流 6、事件委托的实现方法 1、vue写法 1.1、html代码 1.2、js代码 2、原生的写法其实也差不多&#xff1a; 2.1、…

redis中的分布式锁(setIfAbsent)(expire)

目录 应用场景 代码实例1&#xff1a; 代码实例2&#xff1a; setIfAbsent&#xff1a; expire&#xff1a; 举例说明&#xff1a; 代码实例3&#xff1a; 代码实例4&#xff1a; 还是一个同事问的一个问题&#xff0c;然后闲着没事就记录下来了。多人操作同一个保单&a…

全量知识系统问题及SmartChat给出的答复 之2

Q6. 根据DDD的思想( 也就是借助 DDD的某个或某些实现)&#xff0c;是否能按照这个想法给出程序设计和代码结构&#xff1f; 当使用领域驱动设计&#xff08;DDD&#xff09;的思想来设计程序和代码结构时&#xff0c;可以根据领域模型、领域服务、值对象、实体等概念来进行设计…

全网最详细的接口自动化测试框架实战(Pytest+Allure+Excel)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1. Allure 简介 Allure 框架是一个灵活的、轻量级的、支持多语…

k8s service的概念以及创建方法

Service 的功能&#xff1a; Service主要用于提供网络服务&#xff0c;通过Service的定义&#xff0c;能够为客户端应用提供稳定的访问地址&#xff08;域名或IP地址&#xff09;和负载均衡功能&#xff0c;以及屏蔽后端Endpoint的变化&#xff0c;是K8s实现微服务的核心资源。…

Android 13 - Media框架(32)- ACodec(八)

拖了好久都没有更新&#xff0c;前面写的东西都有些忘了&#xff0c;回过头来再看之前写的内容&#xff0c;觉得有很多地方写的不好&#xff0c;或者说现在又有了新的理解&#xff0c;想要重新修改但是需要修改的内容太多&#xff0c;因此决定按照当前的思路把剩余的内容写完。…

密码学——二次剩余

引言 二次剩余在许多密码学算法和数论问题中具有重要的作用,这个概念涉及到同余方程等概念。 同余 学习二次剩余的概念,首先要了解同余方程的概念,首先默认研究范围为整数,假设 f ( x ) f(x) f(x)是一个整系数多项式,我们讨论是否有整数值x满足同余式 f (

(已解决)mac中全局安装express-generator后,爆出zsh: command not found: express

问题描述&#xff1a; 在mac中全局安装express-generator后&#xff0c;在终端输入express命令提示&#xff1a;zsh: command not found: express 原因分析&#xff1a; 因为系统没有找到express命令的位置。 解决步骤&#xff1a; 检查是否正确安装了express-generator&…

react-JSX基本使用

1.目标 能够知道什么是JSX 能够使用JSX创建React元素 能够在JSX中使用JS表达式 能够使用JSX的条件渲染和列表渲染 能够给JSX添加样式 2.目录 JSX的基本使用 JSX中使用JS表达式 JSX的条件渲染 JSX的列表渲染 JSX的样式处理 3.JSX的基本使用 3.1 createElement()的问题 A. …

Git - 开启2FA

Refrence: [Github实战]双重认证2FA 如何 设置/更改[手把手][2022]_enable two-factor authentication (2fa)-CSDN博客

在Node.js中如何实现用户身份验证和授权

当涉及到构建安全的应用程序时&#xff0c;用户身份验证和授权是至关重要的一环。在Node.js中&#xff0c;我们可以利用一些流行的库和技术来实现这些功能&#xff0c;确保我们的应用程序具有所需的安全性。本篇博客将介绍如何在Node.js中实现用户身份验证和授权。 用户身份验…

“智农”-大棚可视化

基于自主可控的数字孪生技术、物联网技术、大数据技术&#xff0c;构建全流程的新型农业一体化管理平台&#xff0c;围绕产运销管理全流程&#xff0c;实现生产->存储->包装->运输->销售的全链条管理。融合农业数据管理、农业数据预警显示、多维数据综合显示、农产…

Jvm之内存泄漏

1 内存溢出 1.1 概念 java.lang.OutOfMemoryError&#xff0c;是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用&#xff0c;出现OutOfMemoryError。产生该错误的原因主要包括&#xff1a;JVM内存过小。程序不严密&#xff0c;产生了过多的垃圾。 程序体现: 内…