@@ -282,6 +282,71 @@ class Solution {
282
282
}
283
283
```
284
284
285
+ ### Python
286
+
287
+ ``` python
288
+
289
+ class Solution :
290
+ def largestIsland (self , grid : List[List[int ]]) -> int :
291
+ visited = set () # 标记访问过的位置
292
+ m, n = len (grid), len (grid[0 ])
293
+ res = 0
294
+ island_size = 0 # 用于保存当前岛屿的尺寸
295
+ directions = [[0 , 1 ], [0 , - 1 ], [1 , 0 ], [- 1 , 0 ]] # 四个方向
296
+ islands_size = defaultdict(int ) # 保存每个岛屿的尺寸
297
+
298
+ def dfs (island_num , r , c ):
299
+ visited.add((r, c))
300
+ grid[r][c] = island_num # 访问过的位置标记为岛屿编号
301
+ nonlocal island_size
302
+ island_size += 1
303
+ for i in range (4 ):
304
+ nextR = r + directions[i][0 ]
305
+ nextC = c + directions[i][1 ]
306
+ if (nextR not in range (m) or # 行坐标越界
307
+ nextC not in range (n) or # 列坐标越界
308
+ (nextR, nextC) in visited): # 坐标已访问
309
+ continue
310
+ if grid[nextR][nextC] == 1 : # 遇到有效坐标,进入下一个层搜索
311
+ dfs(island_num, nextR, nextC)
312
+
313
+ island_num = 2 # 初始岛屿编号设为2, 因为grid里的数据有0和1, 所以从2开始编号
314
+ all_land = True # 标记是否整个地图都是陆地
315
+ for r in range (m):
316
+ for c in range (n):
317
+ if grid[r][c] == 0 :
318
+ all_land = False # 地图里不全是陆地
319
+ if (r, c) not in visited and grid[r][c] == 1 :
320
+ island_size = 0 # 遍历每个位置前重置岛屿尺寸为0
321
+ dfs(island_num, r, c)
322
+ islands_size[island_num] = island_size # 保存当前岛屿尺寸
323
+ island_num += 1 # 下一个岛屿编号加一
324
+ if all_land:
325
+ return m * n # 如果全是陆地, 返回地图面积
326
+
327
+ count = 0 # 某个位置0变成1后当前岛屿尺寸
328
+ # 因为后续计算岛屿面积要往四个方向遍历,但某2个或3个方向的位置可能同属于一个岛,
329
+ # 所以为避免重复累加,把已经访问过的岛屿编号加入到这个集合
330
+ visited_island = set () # 保存访问过的岛屿
331
+ for r in range (m):
332
+ for c in range (n):
333
+ if grid[r][c] == 0 :
334
+ count = 1 # 把由0转换为1的位置计算到面积里
335
+ visited_island.clear() # 遍历每个位置前清空集合
336
+ for i in range (4 ):
337
+ nearR = r + directions[i][0 ]
338
+ nearC = c + directions[i][1 ]
339
+ if nearR not in range (m) or nearC not in range (n): # 周围位置越界
340
+ continue
341
+ if grid[nearR][nearC] in visited_island: # 岛屿已访问
342
+ continue
343
+ count += islands_size[grid[nearR][nearC]] # 累加连在一起的岛屿面积
344
+ visited_island.add(grid[nearR][nearC]) # 标记当前岛屿已访问
345
+ res = max (res, count)
346
+ return res
347
+
348
+ ```
349
+
285
350
<p align =" center " >
286
351
<a href =" https://programmercarl.com/other/kstar.html " target =" _blank " >
287
352
<img src =" ../pics/网站星球宣传海报.jpg " width =" 1000 " />
0 commit comments