-
Notifications
You must be signed in to change notification settings - Fork 1
/
0827-making-a-large-island.py
32 lines (30 loc) · 1.34 KB
/
0827-making-a-large-island.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution:
def largestIsland(self, grid: List[List[int]]) -> int:
dic = {}
color = 2
for r in range(len(grid)):
for c in range(len(grid[0])):
if grid[r][c] == 1:
dic[color] = self.getAreaOfIsland(grid, r, c, color)
color += 1
maxArea = max(dic.values()) if dic else 0 # in case of all ones -> not change any 0 to 1
for r in range(len(grid)):
for c in range(len(grid[0])):
if grid[r][c] == 0:
maxArea = max(maxArea, self.findCombinedArea(grid, r, c, dic))
return maxArea
def getAreaOfIsland(self, grid, r, c, color):
grid[r][c] = color
area = 1
for nr, nc in [(r-1, c), (r+1, c), (r, c-1), (r, c+1)]:
if 0 <= nr < len(grid) and 0 <= nc < len(grid[0]) and grid[nr][nc] == 1:
area += self.getAreaOfIsland(grid, nr, nc, color)
return area
def findCombinedArea(self, grid, r, c, dic):
visited = {0}
combinedArea = 1
for nr, nc in [(r-1, c), (r+1, c), (r, c-1), (r, c+1)]:
if 0 <= nr < len(grid) and 0 <= nc < len(grid[0]) and grid[nr][nc] not in visited:
combinedArea += dic[grid[nr][nc]]
visited.add(grid[nr][nc])
return combinedArea