Полагаю, вопрос в том, чтобы понять алгоритм, а не Python.Предоставленный код Python довольно прост.
Код содержит функцию maxAreaOfIsland
, которая в свою очередь содержит рекурсивную функцию dfs
.Эти 2 функции образуют 2 уровня вычислений.Давайте посмотрим на эти слои отдельно.
# outer layer
def maxAreaOfIsland(grid):
row, col = len(grid), len(grid[0])
# function dfs() definition
return max(dfs(i, j) for i in range(row) for j in range(col))
Таким образом, внешний слой очень прост - вычислите dfs(i, j)
для всех возможных i
и j
, затем выберите максимальное вычисленное значение.
# inner layer - slightly modified
def dfs(i, j):
# recursive case
if (0 <= i <= row - 1 and 0 <= j <= col - 1) and grid[i][j] == 1:
grid[i][j] = 0 # this is how we remember visited cells since we don't count zeros
# optional prints to look at the grid during computation
# print(i, j)
# print(*grid, sep='\n', end='\n\n')
count_current = 1
count_neighbors = dfs(i - 1, j) + dfs(i + 1, j) + dfs(i, j - 1) + dfs(i, j + 1)
return count_current + count_neighbors
# trivial case and out-of-borders case
else:
return 0
Внутренний слой немного сложнее.Что оно делает?(1) Он получает i
и j
.(2) Если ячейка содержит 0
, то это тривиальный случай (вода) или мы не в сетке - просто верните 0
.(3) Если ячейка содержит 1
, то это рекурсивный регистр (земля) - функция начинает подсчитывать количество всех 1
, примыкающих к данной ячейке, с каждым счетом 1
, превращающимся в 0
, чтобы избежать двойного счета.
Ваша примерная сетка имеет 3 строки (0, 1, 2) и 5 столбцов (0, 1, 2, 3, 4).Предположим, мы находимся на i = 0, j = 2
.Это 1
.Мы считаем его (текущий результат равен 1), превращаем его в 0
и смотрим на его соседей по одному - верхний сосед находится вне сетки, нижний сосед - 0
, левый сосед - 0
, правый сосед -1
.Мы не возвращаем текущий результат, а переходим к правому соседу i = 0, j = 3
.Мы считаем это (результат cuurent равен 2), превращаем его в 0
и смотрим на соседей.Верхний сосед находится вне сетки, нижний сосед - 1
.Мы останавливаемся здесь, мы не возвращаем текущий результат, мы помним о еще 2 соседях, мы переходим к нижнему соседу i = 1, j = 3
.Мы считаем это (текущий результат равен 3), превращаем его в 0
и смотрим на соседейВерхний сосед 1
.Мы останавливаемся здесь, мы не возвращаем текущий результат, мы помним о еще 3 соседях, мы переходим к верхнему соседу i = 0, j = 3
.И так далее.
Мой совет - нарисовать простую примерную сетку (с ручкой на листе бумаги) и вручную применить к ней алгоритм dfs.