当前位置:网站首页>被围绕的区域
被围绕的区域
2022-07-26 22:42:00 【咖啡不加冰和糖】
题目描述:
给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。
找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
思路分析:
该题和岛屿数量特别相似,这道题的难点在于边界的0和内部多个0的连通情况的处理,如下图:

底部边界的0和内部的0是连通的,所以都不需要把这些0改为X。
(1)我们可以对边界进行dfs遍历,将所有的连通的0找到,改为字母‘A’;
(2)遍历数组,遇到元素’0’,改为’X’,遇到元素‘A’,改为’0’
可知‘A’是不需要修改的,所以要改回去。
参考代码:
public void solve(char[][] board) {
if(board == null || board.length == 0)return;
int m = board.length;
int n = board[0].length;
//将左边界和右边界所有的0的连通全改为'A'
for(int i = 0; i < m; i++){
dfs(board, i, 0);
dfs(board, i, n - 1);
}
//将上边界和下边界所有的0的连通全改为'A'
for(int i = 1; i < n - 1; i++){
//这里注意,上面计算时把i=0和i=n-1都计算了
dfs(board, 0, i);
dfs(board, m - 1, i);
}
//将‘A’改回‘O’,将要改的‘O’改为‘X’
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(board[i][j] == 'A')board[i][j] = 'O';
else if(board[i][j] == 'O')board[i][j] = 'X';
}
}
}
//dfs找到所有的0连通元素,改为‘A’
public void dfs(char[][] board, int i, int j){
if(i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != 'O')return;//这里注意:不能写成board[i][j] == 'X'
if(board[i][j] == 'O')board[i][j] = 'A';//关键代码
dfs(board, i + 1, j);
dfs(board, i - 1, j);
dfs(board, i, j + 1);
dfs(board, i, j - 1);
}小结:
dfs中的判断条件中:board[i][j] != 'O’不能改为 board[i][j] == ‘X’,如果改为后者,则对于如下的情况,将所有的‘O’改为‘A’后,board[i][j] == 'X’才返回,因为‘A’ != ‘X’,所以会一直进行递归:

类似题目:
边栏推荐
- Redisson working principle - source code analysis
- Flask学习最佳入门指南
- The difference between golang slice make and new
- Flink的容错机制(checkpoint)
- SparkSql之DataFrame
- Flink based real-time project: user behavior analysis (II: real-time traffic statistics)
- Flink1.11 intervalJoin watermark生成,状态清理机制源码理解&Demo分析
- Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=
- DataNode Decommision
- flink1.11 sql本地运行demo & 本地webUI可视解决
猜你喜欢

MLVB 云直播新体验:毫秒级低延迟直播解决方案(附直播性能对比)

Deep understanding of golang - closures

不止直播:腾讯云直播MLVB 插件除了推流/拉流还有哪些亮眼功能

MySQL index optimization: under what circumstances do you need to build an index (several situations suitable for building an index)

MySQL uses and implements ranking functions rank and deny_ Rank and row_ NUMBER

Logback custom messageconverter

Kubernetes 是什么 ?

MYSQL 使用及实现排名函数RANK、DENSE_RANK和ROW_NUMBER

数据仓库知识点

李宏毅机器学习(2017版)_P3-4:回归
随机推荐
flink需求之—ProcessFunction(需求:如果30秒内温度连续上升就报警)
Understanding of Flink interval join source code
Applet live broadcast, online live broadcast, live broadcast reward: Tencent cloud mobile live broadcast component mlvb multi scene live broadcast expansion
网站日志采集和分析流程
SparkSql之DataFrame
Game project export AAB package upload Google tips more than 150m solution
Spark On YARN的作业提交流程
Uni app applet app's advertising realization path: banner information flow advertising
MTCNN
adb shell截屏录屏命令
Redis -- cache avalanche, cache penetration, cache breakdown
Flink based real-time project: user behavior analysis (II: real-time traffic statistics)
Spark source code learning - memory tuning
Canal installation
SparkSql之编程方式
MYSQL中的行锁升级表锁的原因
李宏毅机器学习(2017版)_P1-2:机器学习介绍
基于Flink实时项目:用户行为分析(一:实时热门商品统计)
VSCode2015下编译darknet生成darknet.ext时error MSB3721:XXX已退出,返回代码为 1。
深度学习报告(3)