LeetCode-130. 被围绕的区域-广度优先和深度优先
admin
2024-02-29 06:25:18
0

LeetCode-130. 被围绕的区域

  • 题目描述
  • 解题思路
  • 深度优先算法
  • 广度优先算法

题目描述

给你一个 m x n 的矩阵 board ,由若干字符 XO ,找到所有被 X 围绕的区域,并将这些区域里所有的 OX 填充。

注意边界上的O不会被包围,也就是边界上的O不会被填充成为X

解题思路

board 矩阵中具有三种元素,字符X,被X包围的字符O,没有被X包围的字符O

由于边界上的O不会被填充为X,所以可以转换思想为所有不被X包围的O都与边界的O直接或者间接的相连。

访问四边的边界开始,边界的O就是起点,将O和直接或者间接相连的O标记起来。

标记设定为字符 A,数组标记完毕之后,遍历数组,被标记的就是O没有被标记的就是X

深度优先算法

DFS,从边界开始遍历递归遍历数组进行标记,这里在标记左右和上下两组边的时候,去掉重叠的部分,dfs中判断直接或者间接与边界O相邻的情况就标记为A,这样标记结束之后,数组就剩下标记的A和未标记的O以及原来的X,未标记的O就是被包围的,将其更新为X,标记的A就是未被包围的字符,将其更新为O

dfs 控制边界一旦越界就结束

class Solution {int row,col;public void solve(char[][] board) {row = board.length;if(row == 0) return;col = board[0].length;// 初始化board左右两个边,0和col-1列for(int i = 0; i < row; i++){dfs(board,i,0);dfs(board,i,col - 1);}// 初始化board上下两个边,不包含重叠的部分for(int j = 1; j < col-1; j++){dfs(board,0,j);dfs(board,row-1,j);}// 根据标记还原数组for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(board[i][j] == 'A'){board[i][j] = 'O';}else if(board[i][j] == 'O'){board[i][j] = 'X';}}}}public void dfs(char[][] board,int i,int j){if(i < 0 || i >= row || j < 0 || j >= col || board[i][j] != 'O'){return;}// 直接或者间接与边界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);}
}

广度优先算法

左边和右边的初始化,遇到O入队并且标记

初始化了方向数组,遍历一次对应上下左右的直接相邻。使用了队列保存边界O的联通元素的索引,队列具有O的连通分量就是入队,将该位置标记为A

最后将标记的位置的元素还原即可

class Solution {public void solve(char[][] board) {int row = board.length;if(row == 0) return;int col = board[0].length;int[] dx = {1,-1,0,0};int[] dy = {0,0,1,-1};Deque queue = new LinkedList<>();// 初始化并且标记四个边for(int i = 0; i < row; i++){if(board[i][0] == 'O'){queue.offer(new int[]{i, 0});board[i][0] = 'A';}if(board[i][col-1] == 'O'){queue.offer(new int[]{i, col-1});board[i][col-1] = 'A';}}for(int i = 1; i < col-1; i++){if(board[0][i] == 'O'){queue.offer(new int[]{0, i});board[0][i] = 'A';}if(board[row-1][i] == 'O'){queue.offer(new int[]{row-1, i});board[row-1][i] = 'A';}}while(!queue.isEmpty()){int[] e = queue.poll();int x = e[0],y = e[1];for(int i = 0; i < 4; i++){int mx = x + dx[i],my = y + dy[i];if(mx < 0 || mx >= row || my < 0 || my >= col || board[mx][my] != 'O'){continue;}queue.offer(new int[]{mx,my});board[mx][my] = 'A';}}for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(board[i][j] == 'A'){board[i][j] = 'O';}else if(board[i][j] == 'O'){board[i][j] = 'X';}}}}
}

相关内容

热门资讯

月光下的心理疗愈:二月满月如何... 你是否在满月之夜,静静地仰望星空,感受那轮明亮的月亮带来的宁静与神秘?每当二月份的“雪月”升起,伴随...
原创 巨... 隔夜,现货黄金在欧盘前一度跌至4402.93的日内低点,随后有所反弹,单日振幅达480美元,最终收跌...
百惠金控:香港加速建构黄金中央... 近日,香港特区政府财政司司长发表网志,宣布将与上海黄金交易所(上金所)签署合作备忘录,并即将公布加强...
李佳琦夺达人商业价值百强TOP... 文 | 今朝新闻 近日,胡润发布《2025胡润达人商业价值百强》和《2025胡润中国流量新势力百强...
飞天茅台价格上涨 2月3日,“今日酒价”数据显示,26、25年飞天茅台价格上涨,2026年飞天茅台原箱报1625元/瓶...
年货供应充足,商超年味氛围渐浓 春节临近,年味渐浓,市民购置年货的热情持续攀升。我县各大商超已提前完成年货备货工作,通过科学分区、丰...
主力资金 | 尾盘抢筹9股超亿... 16个行业获主力资金净流入。 A股三大指数今日(2月3日)集体走强,行业板块呈现普涨态势,船舶制造、...
马斯克“点名”!太空光伏概念再... 马斯克看好的太空光伏概念股再度走强。 截至2月3日收盘,光伏ETF(515790.SH)报收1.12...
东鹏饮料今日登陆港交所实现“A... 深圳商报·读创客户端首席记者 谢惠茜 中国饮料巨头加速奔赴全球资本舞台。2月3日,东鹏饮料正式在香港...
酸汤订单“热辣滚烫” 凯里市酸... 春节临近,黔东南州凯里市的酸汤企业迎来一年中最忙碌的时刻,整个产业洋溢着“开门红”的热浪,海外市场成...
Kimi们,活在BAT的阴影下 大厂凭借资本与流量,通过对外投资押注赛道、内部孵化复制爆款,将模型、应用和入口一并收入囊中。大厂不做...
白癜风医生李从悠:青少年白癜风... 临床中发现,青少年是白癜风的高发人群,越来越多的青少年受到白斑困扰,不仅影响外观,还可能打击自信心,...
美的等多家上市公司披露回购新进... 转自:扬子晚报 扬子晚报网2月3日讯(记者 范晓林 薄云峰)2月2日晚间,多家上市公司披露回购进展。...
活力广东何以吸引“天下货” 春节将至,新年味浓,国内市场对进口优质应节食品的需求持续升温。近日,在东莞清溪保税物流中心(B型)查...
反转定调春节行情,两大主线闭眼... 反转定调春节行情,两大主线闭眼捡钱——2月3日A股复盘 昨天还在割肉骂街,今天就追高拍腿,这就是A股...
地方两会聚焦消费扩内需 传统消... (图片来源:摄图网) (记者 叶菁)近期,湖南、河南等多地发放消费券;在地方两会中,多地围绕增强消...
经济热点快评|各地公布GDP,... 最近,各地2025年经济成绩单陆续公布: 山东跻身“10万亿之省”,北京新晋“5万亿之城”,大连、温...
刚刚,上海黄金交易所连发通知! 来源:滚动播报 (来源:上观新闻) 今天(2月3日),现货黄金重新站上4900美元/盎司,日内涨超...
原创 高... 2月3日,有行业媒体报道称,高鑫零售新任CEO李卫平连续两天没有出现在总公司,于1月29日被经侦突然...
原创 闷... 在探讨低调做人、高调做事这一文化传统时,我们不难发现,这种理念不仅渗透进了每个个体的生活,也深深地影...