mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 23:11:09 +00:00
113 lines
3.3 KiB
Python
113 lines
3.3 KiB
Python
|
"""
|
||
|
Given an two dimensional binary matrix grid. An island is a group of 1's (representing
|
||
|
land) connected 4-directionally (horizontal or vertical.) You may assume all four edges
|
||
|
of the grid are surrounded by water. The area of an island is the number of cells with
|
||
|
a value 1 in the island. Return the maximum area of an island in a grid. If there is no
|
||
|
island, return 0.
|
||
|
"""
|
||
|
|
||
|
matrix = [
|
||
|
[0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
|
||
|
[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
|
||
|
[0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
|
||
|
[0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0],
|
||
|
[0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0],
|
||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
|
||
|
[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
|
||
|
[0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
|
||
|
]
|
||
|
|
||
|
|
||
|
def is_safe(row: int, col: int, rows: int, cols: int) -> bool:
|
||
|
"""
|
||
|
Checking whether coordinate (row, col) is valid or not.
|
||
|
|
||
|
>>> is_safe(0, 0, 5, 5)
|
||
|
True
|
||
|
>>> is_safe(-1,-1, 5, 5)
|
||
|
False
|
||
|
"""
|
||
|
return 0 <= row < rows and 0 <= col < cols
|
||
|
|
||
|
|
||
|
def depth_first_search(row: int, col: int, seen: set, mat: list[list[int]]) -> int:
|
||
|
"""
|
||
|
Returns the current area of the island
|
||
|
|
||
|
>>> depth_first_search(0, 0, set(), matrix)
|
||
|
0
|
||
|
"""
|
||
|
rows = len(mat)
|
||
|
cols = len(mat[0])
|
||
|
if is_safe(row, col, rows, cols) and (row, col) not in seen and mat[row][col] == 1:
|
||
|
seen.add((row, col))
|
||
|
return (
|
||
|
1
|
||
|
+ depth_first_search(row + 1, col, seen, mat)
|
||
|
+ depth_first_search(row - 1, col, seen, mat)
|
||
|
+ depth_first_search(row, col + 1, seen, mat)
|
||
|
+ depth_first_search(row, col - 1, seen, mat)
|
||
|
)
|
||
|
else:
|
||
|
return 0
|
||
|
|
||
|
|
||
|
def find_max_area(mat: list[list[int]]) -> int:
|
||
|
"""
|
||
|
Finds the area of all islands and returns the maximum area.
|
||
|
|
||
|
>>> find_max_area(matrix)
|
||
|
6
|
||
|
"""
|
||
|
seen: set = set()
|
||
|
|
||
|
max_area = 0
|
||
|
for row, line in enumerate(mat):
|
||
|
for col, item in enumerate(line):
|
||
|
if item == 1 and (row, col) not in seen:
|
||
|
# Maximizing the area
|
||
|
max_area = max(max_area, depth_first_search(row, col, seen, mat))
|
||
|
return max_area
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
import doctest
|
||
|
|
||
|
print(find_max_area(matrix)) # Output -> 6
|
||
|
|
||
|
"""
|
||
|
Explanation:
|
||
|
We are allowed to move in four directions (horizontal or vertical) so the possible
|
||
|
in a matrix if we are at x and y position the possible moving are
|
||
|
|
||
|
Directions are [(x, y+1), (x, y-1), (x+1, y), (x-1, y)] but we need to take care of
|
||
|
boundary cases as well which are x and y can not be smaller than 0 and greater than
|
||
|
the number of rows and columns respectively.
|
||
|
|
||
|
Visualization
|
||
|
mat = [
|
||
|
[0,0,A,0,0,0,0,B,0,0,0,0,0],
|
||
|
[0,0,0,0,0,0,0,B,B,B,0,0,0],
|
||
|
[0,C,C,0,D,0,0,0,0,0,0,0,0],
|
||
|
[0,C,0,0,D,D,0,0,E,0,E,0,0],
|
||
|
[0,C,0,0,D,D,0,0,E,E,E,0,0],
|
||
|
[0,0,0,0,0,0,0,0,0,0,E,0,0],
|
||
|
[0,0,0,0,0,0,0,F,F,F,0,0,0],
|
||
|
[0,0,0,0,0,0,0,F,F,0,0,0,0]
|
||
|
]
|
||
|
|
||
|
For visualization, I have defined the connected island with letters
|
||
|
by observation, we can see that
|
||
|
A island is of area 1
|
||
|
B island is of area 4
|
||
|
C island is of area 4
|
||
|
D island is of area 5
|
||
|
E island is of area 6 and
|
||
|
F island is of area 5
|
||
|
|
||
|
it has 6 unique islands of mentioned areas
|
||
|
and the maximum of all of them is 6 so we return 6.
|
||
|
"""
|
||
|
|
||
|
doctest.testmod()
|