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

[解题思路]

 board的四个边上的O是无法被X包围的,故如果在四个边上发现O,则这些O应当被保留 从这些O出发继续寻找相邻的O,这些O也是要保留的

 等这些O都标记结束,则剩余的O就应该被改成X

1.使用DFS解,在过大数据集时会挂掉,200*200的矩阵会栈溢出,

 1 public class Solution {
 2     public static void solve(char[][] board) {
 3         if (board == null || board.length == 0) {
 4             return;
 5         }
 6         int row = board.length;
 7         int col = board[0].length;
 8 
 9         // up row
10         for (int j = 0; j < col; j++) {
11             if (board[0][j] == 'O') {
12                 dfs(board, 0, j);
13             }
14         }
15 
16         // bottom row
17         for (int j = 0; j < col; j++) {
18             if (board[row - 1][j] == 'O') {
19                 dfs(board, row - 1, j);
20             }
21         }
22 
23         // left column
24         for (int i = 0; i < row; i++) {
25             if (board[i][0] == 'O') {
26                 dfs(board, i, 0);
27             }
28         }
29 
30         // right column
31         for (int i = 0; i < row; i++) {
32             if (board[i][col - 1] == 'O') {
33                 dfs(board, i, col - 1);
34             }
35         }
36 
37         for (int i = 0; i < row; i++) {
38             for (int j = 0; j < col; j++) {
39                 if (board[i][j] == 'O') {
40                     board[i][j] = 'X';
41                 }
42                 if (board[i][j] == 'P') {
43                     board[i][j] = 'O';
44                 }
45             }
46         }
47     }
48 
49     private static void dfs(char[][] board, int i, int j) {
50         if(i < 0 || i >= board.length || j < 0 || j > board[0].length || board[i][j] != 'O'){
51             return;
52         }
53         board[i][j] = 'P';
54 
55         // up
56         if (i - 1 >= 0 && board[i - 1][j] == 'O') {
57             dfs(board, i - 1, j);
58         }
59         // bottom
60         if (i + 1 < board.length && board[i + 1][j] == 'O') {
61             dfs(board, i + 1, j);
62         }
63         // left
64         if (j - 1 >= 0 && board[i][j - 1] == 'O') {
65             dfs(board, i, j - 1);
66         }
67         // right
68         if (j + 1 < board[0].length && board[i][j + 1] == 'O') {
69             dfs(board, i, j + 1);
70         }
71 
72     }
73 }

 2.BFS

使用BFS来对board进行遍历,如果当前格是'O',则将该格位置放入到queue中

遍历queue,queue中当前格是'O'时,将其内容改为'P',则将该格的上下左右都放入到queue中,

 1 public class Solution {
 2     private Queue<Integer> queue = new LinkedList<Integer>();
 3     public void solve(char[][] board) {
 4         if (board.length == 0) {
 5             return;
 6         }
 7         if (board[0].length == 0) {
 8             return;
 9         }
10         int row = board.length;
11         int col = board[0].length;
12 
13         // up row
14         for (int j = 0; j < col; j++) {
15             if (board[0][j] == 'O') {
16                 bfs(board, 0, j);
17             }
18         }
19 
20         // bottom row
21         for (int j = 0; j < col; j++) {
22             if (board[row - 1][j] == 'O') {
23                 bfs(board, row - 1, j);
24             }
25         }
26 
27         // left column
28         for (int i = 0; i < row; i++) {
29             if (board[i][0] == 'O') {
30                 bfs(board, i, 0);
31             }
32         }
33 
34         // right column
35         for (int i = 0; i < row; i++) {
36             if (board[i][col - 1] == 'O') {
37                 bfs(board, i, col - 1);
38             }
39         }
40 
41         for (int i = 0; i < row; i++) {
42             for (int j = 0; j < col; j++) {
43                 if (board[i][j] == 'O') {
44                     board[i][j] = 'X';
45                 }
46                 if (board[i][j] == 'P') {
47                     board[i][j] = 'O';
48                 }
49             }
50         }
51 
52     }
53 
54     private void fill(char[][] board, int i, int j) {
55         int row = board.length;
56         int col = board[0].length;
57         if (i < 0 || i >= row || j < 0 || j >= col || board[i][j] != 'O')
58             return;
59 
60         queue.offer(i * col + j);
61         board[i][j] = 'P';
62     }
63 
64     private void bfs(char[][] board, int i, int j) {
65         int col = board[0].length;
66 
67         fill(board, i, j);
68         
69         while (!queue.isEmpty()) {
70             int cur = queue.poll();
71             int x = cur / col;
72             int y = cur % col;
73 
74             fill(board, x - 1, y);
75             fill(board, x + 1, y);
76             fill(board, x, y - 1);
77             fill(board, x, y + 1);
78         }
79     }
80 }

 

ref:

http://blog.sina.com.cn/s/blog_b9285de20101j1dt.html

转载于:https://www.cnblogs.com/feiling/p/3304120.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值