[LeetCode] 130. Surrounded Regions

Posted aaronliu1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 130. Surrounded Regions相关的知识,希望对你有一定的参考价值。

被围绕的区域。题意是给一个二维矩阵,用大写的X和O(欧,不是零)填满。请找到所有被 ‘X‘ 围绕的区域,并将这些区域里所有的 ‘O‘ 用 ‘X‘ 填充。例子,

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

题意很简单但是注意一个边界条件。题目要你将所有被包围的O用X填充,但是不包括矩阵边界的O。意思是如果矩阵边界上有O,或者矩阵内部的O实际是跟边界上的O有竖直或者水平能连接起来的(类似200题的岛的概念),你就不能将这种O置换成X。

思路还是DFS,但是首先要扫描矩阵的四条边,看看四个border上是否有O,如果有,则需要DFS遍历,找出所有跟这个边界上的O扯上关系的O并且把他们标记成一个别的东西。我这里是标记成1。标记说明这些坐标是不能被改成X的。接下来再次遍历整个矩阵,如果当前坐标上是O,则将这个坐标变成X;如果遇到1,则将其变成O。

时间O(mn)

空间O(n)

Java实现

 1 class Solution {
 2     public void solve(char[][] board) {
 3         // corner case
 4         if (board == null || board.length == 0 || board[0].length == 0) {
 5             return;
 6         }
 7 
 8         // normal case
 9         int m = board.length - 1;
10         int n = board[0].length - 1;
11         // first row and last row
12         for (int i = 0; i <= m; i++) {
13             if (board[i][0] == ‘O‘) {
14                 helper(board, i, 0);
15             }
16             if (board[i][n] == ‘O‘) {
17                 helper(board, i, n);
18             }
19         }
20         // first column and last column
21         for (int i = 0; i <= n; i++) {
22             if (board[0][i] == ‘O‘) {
23                 helper(board, 0, i);
24             }
25             if (board[m][i] == ‘O‘) {
26                 helper(board, m, i);
27             }
28         }
29 
30         // the rest
31         for (int i = 0; i <= m; i++) {
32             for (int j = 0; j <= n; j++) {
33                 if (board[i][j] == ‘O‘) {
34                     board[i][j] = ‘X‘;
35                 } else if (board[i][j] == ‘1‘) {
36                     board[i][j] = ‘O‘;
37                 }
38             }
39         }
40     }
41 
42     private void helper(char[][] board, int r, int c) {
43         if (r < 0 || c < 0 || r > board.length - 1 || c > board[0].length - 1 || board[r][c] != ‘O‘) {
44             return;
45         }
46         board[r][c] = ‘1‘;
47         helper(board, r + 1, c);
48         helper(board, r - 1, c);
49         helper(board, r, c - 1);
50         helper(board, r, c + 1);
51     }
52 }

 

以上是关于[LeetCode] 130. Surrounded Regions的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 130. Surrounded Regions

LeetCode 130. 被围绕的区域

LeetCode(130) Surrounded Regions

LeetCode-130-Surrounded Regions

LeetCode第130题—被围绕的区域—Python实现

LeetCode-面试算法经典-Java实现130-Surrounded Regions(围绕区域)