Max Area of Island
- 2 min read
- Graph
- LC-Medium
Solution
- Depth-first Search or Breadth-first Search
- Why have I not used recursive solutions for this problem?
| Time | Space | Explanation |
|---|
O(rc) | O(rc) | |
Recursive
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
nrows, ncols = len(grid), len(grid[0])
max_area = 0
vis = set()
def get_area(r, c):
if r < 0 or r == nrows or c < 0 or c == ncols or (r, c) in vis or grid[r][c] == 0:
return 0
vis.add((r, c))
area = 0
for dr, dc in [(0, 1), (0, -1), (-1, 0), (1, 0)]:
nr, nc = r + dr, c + dc
area += get_area(nr, nc)
return 1 + area
for r in range(nrows):
for c in range(ncols):
area = get_area(r, c)
max_area = max(area, max_area)
return max_area
Iterative
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
nrows, ncols = len(grid), len(grid[0])
visited = set()
max_area = 0
def get_area(r, c):
stack = [(r, c)]
area = 0
while stack:
r, c = stack.pop()
if (r, c) not in visited:
visited.add((r, c))
area += 1
for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
nr, nc = r + dr, c + dc
if nr >= 0 and nr < nrows and nc >= 0 and nc < ncols and grid[nr][nc]:
stack.append((nr, nc))
return area
for r in range(nrows):
for c in range(ncols):
if grid[r][c] and (r, c) not in visited:
area = get_area(r, c)
max_area = max(max_area, area)
return max_area