@@ -40,37 +40,32 @@ X O X X
4040
4141## 思路
4242
43- 我们需要将所有被X包围的O变成X,并且题目明确说了边缘的所有O都是不可以变成X的 。
43+ 我们需要将所有被 X 包围的 O 变成 X,并且题目明确说了边缘的所有 O 都是不可以变成 X 的 。
4444
4545![ 130.surrounded-regions] ( https://tva1.sinaimg.cn/large/007S8ZIlly1ghlu7kk7n3j30ee09waap.jpg )
4646
47- 其实我们观察会发现,我们除了边缘的O以及和边缘O连通的O是不需要变成X的,其他都要变成X 。
47+ 其实我们观察会发现,我们除了边缘的 O 以及和边缘 O 连通的 O 是不需要变成 X 的,其他都要变成 X 。
4848
4949经过上面的思考,问题转化为连通区域问题。 这里我们需要标记一下` 边缘的O以及和边缘O连通的O ` 。
50- 我们当然可以用额外的空间去存,但是对于这道题目而言,我们完全可以mutate 。这样就空间复杂度会好一点。
50+ 我们当然可以用额外的空间去存,但是对于这道题目而言,我们完全可以 mutate 。这样就空间复杂度会好一点。
5151
5252整个过程如图所示:
5353
5454> 我将` 边缘的O以及和边缘O连通的O ` 标记为了 "A"
5555
5656![ 130.surrounded-regions] ( https://tva1.sinaimg.cn/large/007S8ZIlly1ghlu7ms9mij30mr0b9q4c.jpg )
5757
58-
59-
6058## 关键点解析
6159
62- - 二维数组DFS解题模板
60+ - 二维数组 DFS 解题模板
6361- 转化问题为` 连通区域问题 `
64- - 直接mutate原数组 ,节省空间
62+ - 直接 mutate 原数组 ,节省空间
6563
6664## 代码
6765
68- * 语言支持:JS,Python3
66+ - 语言支持:JS,Python3, CPP
6967
7068``` js
71-
72-
73-
7469/*
7570 * @lc app=leetcode id=130 lang=javascript
7671 *
@@ -91,7 +86,7 @@ function mark(board, i, j, rows, cols) {
9186 * @param {character[][]} board
9287 * @return {void} Do not return anything, modify board in-place instead.
9388 */
94- var solve = function (board ) {
89+ var solve = function (board ) {
9590 const rows = board .length ;
9691 if (rows === 0 ) return [];
9792 const cols = board[0 ].length ;
@@ -117,7 +112,9 @@ var solve = function(board) {
117112 return board;
118113};
119114```
115+
120116Python Code:
117+
121118``` python
122119class Solution :
123120 def solve (self , board : List[List[str ]]) -> None :
@@ -127,31 +124,31 @@ class Solution:
127124 # 如果数组长或宽小于等于2,则不需要替换
128125 if len (board) <= 2 or len (board[0 ]) <= 2 :
129126 return
130-
127+
131128 row, col = len (board), len (board[0 ])
132-
129+
133130 def dfs (i , j ):
134131 """
135132 深度优先算法,如果符合条件,替换为A并进一步测试,否则停止
136133 """
137134 if i < 0 or j < 0 or i >= row or j >= col or board[i][j] != ' O' :
138135 return
139136 board[i][j] = ' A'
140-
137+
141138 dfs(i - 1 , j)
142139 dfs(i + 1 , j)
143140 dfs(i, j - 1 )
144141 dfs(i, j + 1 )
145-
142+
146143 # 从外围开始
147144 for i in range (row):
148145 dfs(i, 0 )
149146 dfs(i, col- 1 )
150-
147+
151148 for j in range (col):
152149 dfs(0 , j)
153150 dfs(row- 1 , j)
154-
151+
155152 # 最后完成替换
156153 for i in range (row):
157154 for j in range (col):
@@ -161,22 +158,50 @@ class Solution:
161158 board[i][j] = ' O'
162159```
163160
161+ CPP Code:
162+
163+ ``` cpp
164+ class Solution {
165+ int M, N, dirs[ 4] [ 2 ] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
166+ void dfs(vector<vector<char >> &board, int x, int y) {
167+ if (x < 0 || x >= M || y < 0 || y >= N || board[ x] [ y ] != 'O') return;
168+ board[ x] [ y ] = '#';
169+ for (auto &dir : dirs) dfs(board, x + dir[ 0] , y + dir[ 1] );
170+ }
171+ public:
172+ void solve(vector<vector<char >>& board) {
173+ if (board.empty() || board[ 0] .empty()) return;
174+ M = board.size(), N = board[ 0] .size();
175+ for (int i = 0; i < M; ++i) {
176+ dfs(board, i, 0);
177+ dfs(board, i, N - 1);
178+ }
179+ for (int j = 0; j < N; ++j) {
180+ dfs(board, 0, j);
181+ dfs(board, M - 1, j);
182+ }
183+ for (auto &row : board) {
184+ for (auto &cell : row) {
185+ cell = cell == '#' ? 'O' : 'X';
186+ }
187+ }
188+ }
189+ };
190+ ```
191+
164192## 相关题目
165193
166194- [200.number-of-islands](./200.number-of-islands.md)
167195
168196> 解题模板是一样的
169197
170198**复杂度分析**
199+
171200- 时间复杂度:$$O(row * col)$$
172201- 空间复杂度:$$O(row * col)$$
173202
174- 更多题解可以访问我的LeetCode题解仓库 :https://github.com/azl397985856/leetcode 。 目前已经37K star啦 。
203+ 更多题解可以访问我的 LeetCode 题解仓库 :https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦 。
175204
176205关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
177206
178-
179207
180-
181-
182-
0 commit comments