Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit c35a886

Browse files
committed
添加0827.最大人工岛Python3版本
1 parent d5b2f68 commit c35a886

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

‎problems/0827.最大人工岛.md‎

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,71 @@ class Solution {
282282
}
283283
```
284284

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+
285350
<p align="center">
286351
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
287352
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /