63
63
64
64
<!-- 这里可写通用的实现逻辑 -->
65
65
66
- 深度优先搜索,利用 vis 记录访问过的位置。
66
+ ** 方法一:DFS**
67
+
68
+ 我们从位置 $(row, col)$ 出发,利用 DFS 搜索所有颜色为 $grid[ row] [ col ] $ 的网格块,如果该网格块的某个相邻位置的颜色不为 $grid[ row] [ col ] $,或者该网格块在网格的边界上,则将该网格块的颜色改为 $color$。
69
+
70
+ 时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是网格的行数和列数。
67
71
68
72
<!-- tabs:start -->
69
73
@@ -76,24 +80,22 @@ class Solution:
76
80
def colorBorder (
77
81
self , grid : List[List[int ]], row : int , col : int , color : int
78
82
) -> List[List[int ]]:
79
- m, n = len (grid), len (grid[0 ])
80
- vis = [[False ] * n for _ in range (m)]
81
-
82
- def dfs (i , j , color ):
83
+ def dfs (i : int , j : int , c : int ) -> None :
83
84
vis[i][j] = True
84
- old_color = grid[i][j]
85
- for a, b in [[- 1 , 0 ], [1 , 0 ], [0 , - 1 ], [0 , 1 ]]:
86
- x, y = a + i, b + j
85
+ for a, b in pairwise((- 1 , 0 , 1 , 0 , - 1 )):
86
+ x, y = i + a, j + b
87
87
if 0 <= x < m and 0 <= y < n:
88
88
if not vis[x][y]:
89
- if grid[x][y] == old_color :
90
- dfs(x, y, color )
89
+ if grid[x][y] == c :
90
+ dfs(x, y, c )
91
91
else :
92
92
grid[i][j] = color
93
93
else :
94
94
grid[i][j] = color
95
95
96
- dfs(row, col, color)
96
+ m, n = len (grid), len (grid[0 ])
97
+ vis = [[False ] * n for _ in range (m)]
98
+ dfs(row, col, grid[row][col])
97
99
return grid
98
100
```
99
101
@@ -103,23 +105,31 @@ class Solution:
103
105
104
106
``` java
105
107
class Solution {
106
- private int [] dirs = new int [] {- 1 , 0 , 1 , 0 , - 1 };
107
-
108
- public int [][] colorBorder (int [][] grid , int r0 , int c0 , int color ) {
109
- boolean [][] vis = new boolean [grid. length][grid[0 ].length];
110
- dfs(grid, r0, c0, color, vis);
108
+ private int [][] grid;
109
+ private int color;
110
+ private int m;
111
+ private int n;
112
+ private boolean [][] vis;
113
+
114
+ public int [][] colorBorder (int [][] grid , int row , int col , int color ) {
115
+ this . grid = grid;
116
+ this . color = color;
117
+ m = grid. length;
118
+ n = grid[0 ]. length;
119
+ vis = new boolean [m][n];
120
+ dfs(row, col, grid[row][col]);
111
121
return grid;
112
122
}
113
123
114
- private void dfs (int [][] grid , int i , int j , int color , boolean [][] vis ) {
124
+ private void dfs (int i , int j , int c ) {
115
125
vis[i][j] = true ;
116
- int oldColor = grid[i][j] ;
126
+ int [] dirs = { - 1 , 0 , 1 , 0 , - 1 } ;
117
127
for (int k = 0 ; k < 4 ; ++ k) {
118
128
int x = i + dirs[k], y = j + dirs[k + 1 ];
119
- if (x >= 0 && x < grid . length && y >= 0 && y < grid[ 0 ] . length ) {
129
+ if (x >= 0 && x < m && y >= 0 && y < n ) {
120
130
if (! vis[x][y]) {
121
- if (grid[x][y] == oldColor ) {
122
- dfs(grid, x, y, color, vis );
131
+ if (grid[x][y] == c ) {
132
+ dfs(x, y, c );
123
133
} else {
124
134
grid[i][j] = color;
125
135
}
@@ -137,32 +147,32 @@ class Solution {
137
147
``` cpp
138
148
class Solution {
139
149
public:
140
- int m, n;
141
- vector<vector<int >> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
142
-
143
150
vector<vector<int >> colorBorder(vector<vector<int >>& grid, int row, int col, int color) {
144
- m = grid.size();
145
- n = grid[0].size();
146
- vector<vector<bool>> vis(m, vector<bool>(n, false));
147
- dfs(row, col, color, grid, vis);
148
- return grid;
149
- }
150
-
151
- void dfs (int i, int j, int color, vector<vector<int >>& grid, vector<vector<bool >>& vis) {
152
- vis[ i] [ j ] = true;
153
- int oldColor = grid[ i] [ j ] ;
154
- for (auto& dir : dirs) {
155
- int x = i + dir[ 0] , y = j + dir[ 1] ;
156
- if (x >= 0 && x < m && y >= 0 && y < n) {
157
- if (!vis[ x] [ y ] ) {
158
- if (grid[ x] [ y ] == oldColor)
159
- dfs(x, y, color, grid, vis);
160
- else
161
- grid[ i] [ j ] = color;
151
+ int m = grid.size();
152
+ int n = grid[ 0] .size();
153
+ bool vis[ m] [ n ] ;
154
+ memset(vis, false, sizeof(vis));
155
+ int dirs[ 5] = {-1, 0, 1, 0, -1};
156
+ function<void(int, int, int)> dfs = [ &] (int i, int j, int c) {
157
+ vis[ i] [ j ] = true;
158
+ for (int k = 0; k < 4; ++k) {
159
+ int x = i + dirs[ k] ;
160
+ int y = j + dirs[ k + 1] ;
161
+ if (x >= 0 && x < m && y >= 0 && y < n) {
162
+ if (!vis[ x] [ y ] ) {
163
+ if (grid[ x] [ y ] == c) {
164
+ dfs(x, y, c);
165
+ } else {
166
+ grid[ i] [ j ] = color;
167
+ }
168
+ }
169
+ } else {
170
+ grid[ i] [ j ] = color;
162
171
}
163
- } else
164
- grid[ i] [ j ] = color;
165
- }
172
+ }
173
+ };
174
+ dfs(row, col, grid[ row] [ col ] );
175
+ return grid;
166
176
}
167
177
};
168
178
```
@@ -173,21 +183,19 @@ public:
173
183
func colorBorder(grid [][]int, row int, col int, color int) [][]int {
174
184
m, n := len(grid), len(grid[0])
175
185
vis := make([][]bool, m)
176
- for i := 0; i < m; i++ {
186
+ for i := range vis {
177
187
vis[i] = make([]bool, n)
178
188
}
179
- dirs := [4][2]int{{0, -1}, {0, 1}, {1, 0}, {-1, 0}}
180
-
181
- var dfs func(i, j, color int)
182
- dfs = func(i, j, color int) {
189
+ dirs := [5]int{-1, 0, 1, 0, -1}
190
+ var dfs func(int, int, int)
191
+ dfs = func(i, j, c int) {
183
192
vis[i][j] = true
184
- oldColor := grid[i][j]
185
- for _, dir := range dirs {
186
- x, y := i+dir[0], j+dir[1]
193
+ for k := 0; k < 4; k++ {
194
+ x, y := i+dirs[k], j+dirs[k+1]
187
195
if x >= 0 && x < m && y >= 0 && y < n {
188
196
if !vis[x][y] {
189
- if grid[x][y] == oldColor {
190
- dfs(x, y, color )
197
+ if grid[x][y] == c {
198
+ dfs(x, y, c )
191
199
} else {
192
200
grid[i][j] = color
193
201
}
@@ -197,7 +205,7 @@ func colorBorder(grid [][]int, row int, col int, color int) [][]int {
197
205
}
198
206
}
199
207
}
200
- dfs(row, col, color )
208
+ dfs(row, col, grid[row][col] )
201
209
return grid
202
210
}
203
211
```
0 commit comments