【leetcode刷题笔记】Surrounded Regions
Given a 2D board containing 'X'
and 'O'
, capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
s into 'X'
s in that surrounded region.
For example,
X X X X
X O O X
X X O X
X O X X
After running your function, the board should be:
X X X X
X X X X
X X X X
X O X X
题解:用的BFS。
最外围的O肯定是没法变成X的,把这些O推进一个队列里面,然后从它们开始上下左右进行广度优先搜索,它们周围的O也是不用变成X的(因为它有一条突围出去的都是O的路径),然后从周围的点继续广搜......
实现细节:
- 用一个visited二维数组记录某个O是否已经进过队列了,这样就不会死循环;
- 另一个二维数组isX记录哪些点不用变成X,在BFS结束后,把要变成X的点都变成X;
- 题目中X和O都是大写的=。=
实现代码如下:
1 public class Solution { 2 class co{ 3 int x; 4 int y; 5 public co(int x,int y){ 6 this.x = x; 7 this.y = y; 8 } 9 } 10 public void solve(char[][] board) { 11 if(board == null || board.length == 0) 12 return; 13 int m = board.length; 14 int n = board[0].length; 15 boolean[][] visited = new boolean[m][n]; 16 boolean[][] isX = new boolean[m][n]; 17 for(boolean[] row:isX) 18 Arrays.fill(row, true); 19 //put all o's cordinates into queue 20 Queue<co> queue = new LinkedList<co>(); 21 22 //first line and last line 23 for(int i = 0;i < n;i++) 24 { 25 if(board[0][i]=='O'){ 26 queue.add(new co(0, i)); 27 visited[0][i]= true; 28 isX[0][i]= false; 29 } 30 if(board[m-1][i]=='O'){ 31 queue.add(new co(m-1, i)); 32 visited[m-1][i]= true; 33 isX[m-1][i]= false; 34 } 35 } 36 37 //first and last column 38 for(int j = 0;j<m;j++){ 39 if(board[j][0]=='O'){ 40 queue.add(new co(j, 0)); 41 visited[j][0]= true; 42 isX[j][0]= false; 43 } 44 if(board[j][n-1]=='O'){ 45 queue.add(new co(j,n-1)); 46 visited[j][n-1]= true; 47 isX[j][n-1]= false; 48 } 49 } 50 51 while(!queue.isEmpty()){ 52 co c = queue.poll(); 53 //up 54 if(c.x >= 1 && board[c.x-1][c.y] == 'O'&&!visited[c.x-1][c.y]){ 55 visited[c.x-1][c.y] = true; 56 isX[c.x-1][c.y] = false; 57 queue.add(new co(c.x-1, c.y)); 58 } 59 //down 60 if(c.x+1<m && board[c.x+1][c.y]=='O' && !visited[c.x+1][c.y]){ 61 visited[c.x+1][c.y] = true; 62 isX[c.x+1][c.y]= false; 63 queue.add(new co(c.x+1, c.y)); 64 } 65 //left 66 if(c.y-1>=0 && board[c.x][c.y-1]=='O' && !visited[c.x][c.y-1]){ 67 visited[c.x][c.y-1] = true; 68 isX[c.x][c.y-1] = false; 69 queue.add(new co(c.x, c.y-1)); 70 } 71 //right 72 if(c.y+1<n && board[c.x][c.y+1] == 'O' && !visited[c.x][c.y+1]){ 73 visited[c.x][c.y+1] = true; 74 isX[c.x][c.y+1] = false; 75 queue.add(new co(c.x, c.y+1)); 76 } 77 } 78 for(int i = 0;i < m;i++){ 79 for(int j = 0;j < n;j++){ 80 if(isX[i][j] ) 81 board[i][j]= 'X'; 82 } 83 } 84 return; 85 } 86 }
分类:
leetcode刷题总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了