Skip to content

Commit f3663ff

Browse files
committed
feat: update solutions to lc problem: No.0200.Number of Islands
1 parent ce08212 commit f3663ff

File tree

5 files changed

+84
-169
lines changed

5 files changed

+84
-169
lines changed

solution/0200-0299/0200.Number of Islands/README.md

+30-59
Original file line numberDiff line numberDiff line change
@@ -67,34 +67,27 @@ BFS、DFS、并查集均可。
6767
class Solution:
6868
def numIslands(self, grid: List[List[str]]) -> int:
6969
m, n = len(grid), len(grid[0])
70-
p = [-1] * (m * n)
70+
p = list(range(m * n))
7171

7272
def find(x):
7373
if p[x] != x:
7474
p[x] = find(p[x])
7575
return p[x]
7676

77-
for i in range(m):
78-
for j in range(n):
79-
if grid[i][j] == '1':
80-
p[i * n + j] = i * n + j
81-
8277
for i in range(m):
8378
for j in range(n):
8479
if grid[i][j] == '1':
8580
if i < m - 1 and grid[i + 1][j] == '1':
86-
a, b = i * n + j, (i + 1) * n + j
87-
p[find(a)] = find(b)
81+
p[find(i * n + j)] = find((i + 1) * n + j)
8882
if j < n - 1 and grid[i][j + 1] == '1':
89-
a, b = i * n + j, i * n + j + 1
90-
p[find(a)] = find(b)
91-
92-
cnt = 0
83+
p[find(i * n + j)] = find(i * n + j + 1)
84+
85+
res = 0
9386
for i in range(m):
9487
for j in range(n):
95-
if i * n + j == find(i * n + j):
96-
cnt += 1
97-
return cnt
88+
if grid[i][j] == '1' and i * n + j == find(i * n + j):
89+
res += 1
90+
return res
9891
```
9992

10093
### **Java**
@@ -142,10 +135,8 @@ class Solution {
142135
public int numIslands(char[][] grid) {
143136
int m = grid.length, n = grid[0].length;
144137
p = new int[m * n];
145-
for (int i = 0; i < m; ++i) {
146-
for (int j = 0; j < n; ++j) {
147-
p[i * n + j] = grid[i][j] == '1' ? i * n + j : -1;
148-
}
138+
for (int i = 0; i < p.length; ++i) {
139+
p[i] = i;
149140
}
150141
for (int i = 0; i < m; ++i) {
151142
for (int j = 0; j < n; ++j) {
@@ -159,15 +150,15 @@ class Solution {
159150
}
160151
}
161152
}
162-
int cnt = 0;
153+
int res = 0;
163154
for (int i = 0; i < m; ++i) {
164155
for (int j = 0; j < n; ++j) {
165-
if (p[i * n + j] != -1 && i * n + j == find(i * n + j)) {
166-
++cnt;
156+
if (grid[i][j] == '1' && i * n + j == find(i * n + j)) {
157+
++res;
167158
}
168159
}
169160
}
170-
return cnt;
161+
return res;
171162
}
172163

173164
private int find(int x) {
@@ -224,71 +215,51 @@ class Solution {
224215
public:
225216
vector<int> p;
226217

227-
int numIslands(vector<vector<char>> &grid) {
218+
int numIslands(vector<vector<char>>& grid) {
228219
int m = grid.size(), n = grid[0].size();
229220
p.resize(m * n);
230-
for (int i = 0; i < m; ++i)
231-
{
232-
for (int j = 0; j < n; ++j)
233-
{
234-
p[i * n + j] = grid[i][j] == '1' ? i * n + j : -1;
235-
}
236-
}
221+
for (int i = 0; i < p.size(); ++i) p[i] = i;
237222
for (int i = 0; i < m; ++i)
238223
{
239224
for (int j = 0; j < n; ++j)
240225
{
241226
if (grid[i][j] == '1')
242227
{
243-
if (i < m - 1 && grid[i + 1][j] == '1')
244-
{
245-
p[find(i * n + j)] = find((i + 1) * n + j);
246-
}
247-
if (j < n - 1 && grid[i][j + 1] == '1')
248-
{
249-
p[find(i * n + j)] = find(i * n + j + 1);
250-
}
228+
if (i < m - 1 && grid[i + 1][j] == '1') p[find(i * n + j)] = find((i + 1) * n + j);
229+
if (j < n - 1 && grid[i][j + 1] == '1') p[find(i * n + j)] = find(i * n + j + 1);
251230
}
252231
}
253232
}
254-
int cnt = 0;
233+
int res = 0;
255234
for (int i = 0; i < m; ++i)
256235
{
257236
for (int j = 0; j < n; ++j)
258237
{
259-
if (p[i * n + j] != -1 && i * n + j == find(i * n + j))
260-
++cnt;
238+
if (grid[i][j] == '1' && i * n + j == find(i * n + j)) ++res;
261239
}
262240
}
263-
return cnt;
241+
return res;
264242
}
265243

266244
int find(int x) {
267-
if (p[x] != x)
268-
{
269-
p[x] = find(p[x]);
270-
}
245+
if (p[x] != x) p[x] = find(p[x]);
271246
return p[x];
272247
}
273248
};
274249
```
275250

276251
### **Go**
277252

253+
并查集:
254+
278255
```go
279256
var p []int
280257

281258
func numIslands(grid [][]byte) int {
282259
m, n := len(grid), len(grid[0])
283260
p = make([]int, m*n)
284-
for i := 0; i < m; i++ {
285-
for j := 0; j < n; j++ {
286-
if grid[i][j] == '1' {
287-
p[i*n+j] = i*n + j
288-
} else {
289-
p[i*n+j] = -1
290-
}
291-
}
261+
for i := 0; i < len(p); i++ {
262+
p[i] = i
292263
}
293264
for i := 0; i < m; i++ {
294265
for j := 0; j < n; j++ {
@@ -302,15 +273,15 @@ func numIslands(grid [][]byte) int {
302273
}
303274
}
304275
}
305-
cnt := 0
276+
res := 0
306277
for i := 0; i < m; i++ {
307278
for j := 0; j < n; j++ {
308-
if p[i*n+j] != -1 && i*n+j == find(i*n+j) {
309-
cnt++
279+
if grid[i][j] == '1' && i*n+j == find(i*n+j) {
280+
res++
310281
}
311282
}
312283
}
313-
return cnt
284+
return res
314285
}
315286

316287
func find(x int) int {

solution/0200-0299/0200.Number of Islands/README_EN.md

+32-59
Original file line numberDiff line numberDiff line change
@@ -54,34 +54,27 @@ Union Find:
5454
class Solution:
5555
def numIslands(self, grid: List[List[str]]) -> int:
5656
m, n = len(grid), len(grid[0])
57-
p = [-1] * (m * n)
57+
p = list(range(m * n))
5858

5959
def find(x):
6060
if p[x] != x:
6161
p[x] = find(p[x])
6262
return p[x]
6363

64-
for i in range(m):
65-
for j in range(n):
66-
if grid[i][j] == '1':
67-
p[i * n + j] = i * n + j
68-
6964
for i in range(m):
7065
for j in range(n):
7166
if grid[i][j] == '1':
7267
if i < m - 1 and grid[i + 1][j] == '1':
73-
a, b = i * n + j, (i + 1) * n + j
74-
p[find(a)] = find(b)
68+
p[find(i * n + j)] = find((i + 1) * n + j)
7569
if j < n - 1 and grid[i][j + 1] == '1':
76-
a, b = i * n + j, i * n + j + 1
77-
p[find(a)] = find(b)
78-
79-
cnt = 0
70+
p[find(i * n + j)] = find(i * n + j + 1)
71+
72+
res = 0
8073
for i in range(m):
8174
for j in range(n):
82-
if i * n + j == find(i * n + j):
83-
cnt += 1
84-
return cnt
75+
if grid[i][j] == '1' and i * n + j == find(i * n + j):
76+
res += 1
77+
return res
8578
```
8679

8780
### **Java**
@@ -127,10 +120,8 @@ class Solution {
127120
public int numIslands(char[][] grid) {
128121
int m = grid.length, n = grid[0].length;
129122
p = new int[m * n];
130-
for (int i = 0; i < m; ++i) {
131-
for (int j = 0; j < n; ++j) {
132-
p[i * n + j] = grid[i][j] == '1' ? i * n + j : -1;
133-
}
123+
for (int i = 0; i < p.length; ++i) {
124+
p[i] = i;
134125
}
135126
for (int i = 0; i < m; ++i) {
136127
for (int j = 0; j < n; ++j) {
@@ -144,15 +135,15 @@ class Solution {
144135
}
145136
}
146137
}
147-
int cnt = 0;
138+
int res = 0;
148139
for (int i = 0; i < m; ++i) {
149140
for (int j = 0; j < n; ++j) {
150-
if (p[i * n + j] != -1 && i * n + j == find(i * n + j)) {
151-
++cnt;
141+
if (grid[i][j] == '1' && i * n + j == find(i * n + j)) {
142+
++res;
152143
}
153144
}
154145
}
155-
return cnt;
146+
return res;
156147
}
157148

158149
private int find(int x) {
@@ -196,76 +187,58 @@ function dfs(grid: string[][], i: number, j: number) {
196187

197188
### **C++**
198189

190+
Union find:
191+
199192
```cpp
200193
class Solution {
201194
public:
202195
vector<int> p;
203196

204-
int numIslands(vector<vector<char>> &grid) {
197+
int numIslands(vector<vector<char>>& grid) {
205198
int m = grid.size(), n = grid[0].size();
206199
p.resize(m * n);
207-
for (int i = 0; i < m; ++i)
208-
{
209-
for (int j = 0; j < n; ++j)
210-
{
211-
p[i * n + j] = grid[i][j] == '1' ? i * n + j : -1;
212-
}
213-
}
200+
for (int i = 0; i < p.size(); ++i) p[i] = i;
214201
for (int i = 0; i < m; ++i)
215202
{
216203
for (int j = 0; j < n; ++j)
217204
{
218205
if (grid[i][j] == '1')
219206
{
220-
if (i < m - 1 && grid[i + 1][j] == '1')
221-
{
222-
p[find(i * n + j)] = find((i + 1) * n + j);
223-
}
224-
if (j < n - 1 && grid[i][j + 1] == '1')
225-
{
226-
p[find(i * n + j)] = find(i * n + j + 1);
227-
}
207+
if (i < m - 1 && grid[i + 1][j] == '1') p[find(i * n + j)] = find((i + 1) * n + j);
208+
if (j < n - 1 && grid[i][j + 1] == '1') p[find(i * n + j)] = find(i * n + j + 1);
228209
}
229210
}
230211
}
231-
int cnt = 0;
212+
int res = 0;
232213
for (int i = 0; i < m; ++i)
233214
{
234215
for (int j = 0; j < n; ++j)
235216
{
236-
if (p[i * n + j] != -1 && i * n + j == find(i * n + j))
237-
++cnt;
217+
if (grid[i][j] == '1' && i * n + j == find(i * n + j)) ++res;
238218
}
239219
}
240-
return cnt;
220+
return res;
241221
}
242222

243223
int find(int x) {
244-
if (p[x] != x)
245-
{
246-
p[x] = find(p[x]);
247-
}
224+
if (p[x] != x) p[x] = find(p[x]);
248225
return p[x];
249226
}
250227
};
251228
```
252229

253230
### **Go**
254231

232+
Union find:
233+
255234
```go
256235
var p []int
257236

258237
func numIslands(grid [][]byte) int {
259238
m, n := len(grid), len(grid[0])
260239
p = make([]int, m*n)
261-
for i := 0; i < m; i++ {
262-
for j := 0; j < n; j++ {
263-
if grid[i][j] == '1' {
264-
p[i*n+j] = i*n + j
265-
} else {
266-
p[i*n+j] = -1
267-
}
268-
}
240+
for i := 0; i < len(p); i++ {
241+
p[i] = i
269242
}
270243
for i := 0; i < m; i++ {
271244
for j := 0; j < n; j++ {
@@ -279,15 +252,15 @@ func numIslands(grid [][]byte) int {
279252
}
280253
}
281254
}
282-
cnt := 0
255+
res := 0
283256
for i := 0; i < m; i++ {
284257
for j := 0; j < n; j++ {
285-
if p[i*n+j] != -1 && i*n+j == find(i*n+j) {
286-
cnt++
258+
if grid[i][j] == '1' && i*n+j == find(i*n+j) {
259+
res++
287260
}
288261
}
289262
}
290-
return cnt
263+
return res
291264
}
292265

293266
func find(x int) int {

0 commit comments

Comments
 (0)