Skip to content

Commit 0d0465d

Browse files
committed
feat: update solutions to lc problem: No.1034
No.1034.Coloring A Border
1 parent 13f95a5 commit 0d0465d

File tree

6 files changed

+182
-166
lines changed

6 files changed

+182
-166
lines changed

solution/1000-1099/1034.Coloring A Border/README.md

Lines changed: 64 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

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$ 分别是网格的行数和列数。
6771

6872
<!-- tabs:start -->
6973

@@ -76,24 +80,22 @@ class Solution:
7680
def colorBorder(
7781
self, grid: List[List[int]], row: int, col: int, color: int
7882
) -> 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:
8384
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
8787
if 0 <= x < m and 0 <= y < n:
8888
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)
9191
else:
9292
grid[i][j] = color
9393
else:
9494
grid[i][j] = color
9595

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])
9799
return grid
98100
```
99101

@@ -103,23 +105,31 @@ class Solution:
103105

104106
```java
105107
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]);
111121
return grid;
112122
}
113123

114-
private void dfs(int[][] grid, int i, int j, int color, boolean[][] vis) {
124+
private void dfs(int i, int j, int c) {
115125
vis[i][j] = true;
116-
int oldColor = grid[i][j];
126+
int[] dirs = {-1, 0, 1, 0, -1};
117127
for (int k = 0; k < 4; ++k) {
118128
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) {
120130
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);
123133
} else {
124134
grid[i][j] = color;
125135
}
@@ -137,32 +147,32 @@ class Solution {
137147
```cpp
138148
class Solution {
139149
public:
140-
int m, n;
141-
vector<vector<int>> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
142-
143150
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;
162171
}
163-
} else
164-
grid[i][j] = color;
165-
}
172+
}
173+
};
174+
dfs(row, col, grid[row][col]);
175+
return grid;
166176
}
167177
};
168178
```
@@ -173,21 +183,19 @@ public:
173183
func colorBorder(grid [][]int, row int, col int, color int) [][]int {
174184
m, n := len(grid), len(grid[0])
175185
vis := make([][]bool, m)
176-
for i := 0; i < m; i++ {
186+
for i := range vis {
177187
vis[i] = make([]bool, n)
178188
}
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) {
183192
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]
187195
if x >= 0 && x < m && y >= 0 && y < n {
188196
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)
191199
} else {
192200
grid[i][j] = color
193201
}
@@ -197,7 +205,7 @@ func colorBorder(grid [][]int, row int, col int, color int) [][]int {
197205
}
198206
}
199207
}
200-
dfs(row, col, color)
208+
dfs(row, col, grid[row][col])
201209
return grid
202210
}
203211
```

solution/1000-1099/1034.Coloring A Border/README_EN.md

Lines changed: 59 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -48,48 +48,54 @@ class Solution:
4848
def colorBorder(
4949
self, grid: List[List[int]], row: int, col: int, color: int
5050
) -> List[List[int]]:
51-
m, n = len(grid), len(grid[0])
52-
vis = [[False] * n for _ in range(m)]
53-
54-
def dfs(i, j, color):
51+
def dfs(i: int, j: int, c: int) -> None:
5552
vis[i][j] = True
56-
old_color = grid[i][j]
57-
for a, b in [[-1, 0], [1, 0], [0, -1], [0, 1]]:
58-
x, y = a + i, b + j
53+
for a, b in pairwise((-1, 0, 1, 0, -1)):
54+
x, y = i + a, j + b
5955
if 0 <= x < m and 0 <= y < n:
6056
if not vis[x][y]:
61-
if grid[x][y] == old_color:
62-
dfs(x, y, color)
57+
if grid[x][y] == c:
58+
dfs(x, y, c)
6359
else:
6460
grid[i][j] = color
6561
else:
6662
grid[i][j] = color
6763

68-
dfs(row, col, color)
64+
m, n = len(grid), len(grid[0])
65+
vis = [[False] * n for _ in range(m)]
66+
dfs(row, col, grid[row][col])
6967
return grid
7068
```
7169

7270
### **Java**
7371

7472
```java
7573
class Solution {
76-
private int[] dirs = new int[] {-1, 0, 1, 0, -1};
77-
78-
public int[][] colorBorder(int[][] grid, int r0, int c0, int color) {
79-
boolean[][] vis = new boolean[grid.length][grid[0].length];
80-
dfs(grid, r0, c0, color, vis);
74+
private int[][] grid;
75+
private int color;
76+
private int m;
77+
private int n;
78+
private boolean[][] vis;
79+
80+
public int[][] colorBorder(int[][] grid, int row, int col, int color) {
81+
this.grid = grid;
82+
this.color = color;
83+
m = grid.length;
84+
n = grid[0].length;
85+
vis = new boolean[m][n];
86+
dfs(row, col, grid[row][col]);
8187
return grid;
8288
}
8389

84-
private void dfs(int[][] grid, int i, int j, int color, boolean[][] vis) {
90+
private void dfs(int i, int j, int c) {
8591
vis[i][j] = true;
86-
int oldColor = grid[i][j];
92+
int[] dirs = {-1, 0, 1, 0, -1};
8793
for (int k = 0; k < 4; ++k) {
8894
int x = i + dirs[k], y = j + dirs[k + 1];
89-
if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length) {
95+
if (x >= 0 && x < m && y >= 0 && y < n) {
9096
if (!vis[x][y]) {
91-
if (grid[x][y] == oldColor) {
92-
dfs(grid, x, y, color, vis);
97+
if (grid[x][y] == c) {
98+
dfs(x, y, c);
9399
} else {
94100
grid[i][j] = color;
95101
}
@@ -107,32 +113,32 @@ class Solution {
107113
```cpp
108114
class Solution {
109115
public:
110-
int m, n;
111-
vector<vector<int>> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
112-
113116
vector<vector<int>> colorBorder(vector<vector<int>>& grid, int row, int col, int color) {
114-
m = grid.size();
115-
n = grid[0].size();
116-
vector<vector<bool>> vis(m, vector<bool>(n, false));
117-
dfs(row, col, color, grid, vis);
118-
return grid;
119-
}
120-
121-
void dfs(int i, int j, int color, vector<vector<int>>& grid, vector<vector<bool>>& vis) {
122-
vis[i][j] = true;
123-
int oldColor = grid[i][j];
124-
for (auto& dir : dirs) {
125-
int x = i + dir[0], y = j + dir[1];
126-
if (x >= 0 && x < m && y >= 0 && y < n) {
127-
if (!vis[x][y]) {
128-
if (grid[x][y] == oldColor)
129-
dfs(x, y, color, grid, vis);
130-
else
131-
grid[i][j] = color;
117+
int m = grid.size();
118+
int n = grid[0].size();
119+
bool vis[m][n];
120+
memset(vis, false, sizeof(vis));
121+
int dirs[5] = {-1, 0, 1, 0, -1};
122+
function<void(int, int, int)> dfs = [&](int i, int j, int c) {
123+
vis[i][j] = true;
124+
for (int k = 0; k < 4; ++k) {
125+
int x = i + dirs[k];
126+
int y = j + dirs[k + 1];
127+
if (x >= 0 && x < m && y >= 0 && y < n) {
128+
if (!vis[x][y]) {
129+
if (grid[x][y] == c) {
130+
dfs(x, y, c);
131+
} else {
132+
grid[i][j] = color;
133+
}
134+
}
135+
} else {
136+
grid[i][j] = color;
132137
}
133-
} else
134-
grid[i][j] = color;
135-
}
138+
}
139+
};
140+
dfs(row, col, grid[row][col]);
141+
return grid;
136142
}
137143
};
138144
```
@@ -143,21 +149,19 @@ public:
143149
func colorBorder(grid [][]int, row int, col int, color int) [][]int {
144150
m, n := len(grid), len(grid[0])
145151
vis := make([][]bool, m)
146-
for i := 0; i < m; i++ {
152+
for i := range vis {
147153
vis[i] = make([]bool, n)
148154
}
149-
dirs := [4][2]int{{0, -1}, {0, 1}, {1, 0}, {-1, 0}}
150-
151-
var dfs func(i, j, color int)
152-
dfs = func(i, j, color int) {
155+
dirs := [5]int{-1, 0, 1, 0, -1}
156+
var dfs func(int, int, int)
157+
dfs = func(i, j, c int) {
153158
vis[i][j] = true
154-
oldColor := grid[i][j]
155-
for _, dir := range dirs {
156-
x, y := i+dir[0], j+dir[1]
159+
for k := 0; k < 4; k++ {
160+
x, y := i+dirs[k], j+dirs[k+1]
157161
if x >= 0 && x < m && y >= 0 && y < n {
158162
if !vis[x][y] {
159-
if grid[x][y] == oldColor {
160-
dfs(x, y, color)
163+
if grid[x][y] == c {
164+
dfs(x, y, c)
161165
} else {
162166
grid[i][j] = color
163167
}
@@ -167,7 +171,7 @@ func colorBorder(grid [][]int, row int, col int, color int) [][]int {
167171
}
168172
}
169173
}
170-
dfs(row, col, color)
174+
dfs(row, col, grid[row][col])
171175
return grid
172176
}
173177
```

0 commit comments

Comments
 (0)