mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-30 16:31:08 +00:00
2ca695b0fe
* Maximum area of island program added * Update matrix/max_area_of_island.py Co-authored-by: Caeden <caedenperelliharris@gmail.com> * Update matrix/max_area_of_island.py Co-authored-by: Caeden <caedenperelliharris@gmail.com> * Update matrix/max_area_of_island.py Co-authored-by: Caeden <caedenperelliharris@gmail.com> * Review's comment resolved * max area of island * PR Comments resolved * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Test case fail fix * Grammer correction * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * flake8 issue resolved * some variable name fix * Update matrix/max_area_of_island.py Co-authored-by: Caeden Perelli-Harris <caedenperelliharris@gmail.com> * Update matrix/max_area_of_island.py Co-authored-by: Caeden Perelli-Harris <caedenperelliharris@gmail.com> * PR, comments resolved * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update matrix/max_area_of_island.py Co-authored-by: Christian Clauss <cclauss@me.com> * Update matrix/max_area_of_island.py Co-authored-by: Christian Clauss <cclauss@me.com> * PR, comments resolved * Update max_area_of_island.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Typo Co-authored-by: Caeden <caedenperelliharris@gmail.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <cclauss@me.com>
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()
|