Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ
Проблема летета # 695 (средний): максимальная площадь острова
Описание:
( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++
Вам дан м х н
Двоичная матричная сетка. Остров – это группа 1
(представляющая землю) связано 4-направленные (горизонтальный или вертикальный.) Вы можете предположить, что все четыре края сетки окружены водой.
область острова – количество клеток со значением 1
на острове.
Вернуть максимум область острова в сетке Отказ Если нет острова, верните 0
Отказ
Примеры:
Вход: | сетка = [[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]] |
Вывод: | 6 |
Объяснение: | Ответ не 11, потому что остров должен быть подключен 4-направленно. |
Визуальный |
Вход: | сетка = [[0,0,0,0,0,0,0,0]] |
Вывод: | 0 |
Ограничения:
m.length
n [I] .length
1, Н.
сетка [я] [j]
это либо0
или1
Отказ
Идея:
( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++
Таким образом, мы можем просто использовать простую итерацию через Сетка И посмотрите на острова. Когда мы находим остров, мы можем использовать рекурсивный Функция помощника ( Trav ), чтобы подвести все связанные кусочки земли и вернуть Общая земная масса острова.
Как мы проходим по острову, мы можем заменить 1 с 0 S для предотвращения «нахождения» та же земли дважды. Мы также можем отслеживать самый большой остров, найденный до сих пор ( ANS ), а после Сетка был полностью пройден, мы можем Вернуть АНС Отказ
- Сложность времени: O (n * m) где N и M являются длиной сторон сетка
- Космическая сложность: O (L) где L это размер крупнейшего острова, представляющий максимум Рекурсионный стек
- или O (n * m + l) Если мы создадим N * M Матрица для того, чтобы не модифицировать вход
Код JavaScript:
( Перейти к : Описание проблемы Идея решения
var maxAreaOfIsland = function(grid) { let ans = 0, n = grid.length, m = grid[0].length const trav = (i, j) => { if (i < 0 || j < 0 || i >= n || j >= m || !grid[i][j]) return 0 grid[i][j] = 0 return 1 + trav(i-1, j) + trav(i, j-1) + trav(i+1, j) + trav(i, j+1) } for (let i = 0; i < n; i++) for (let j = 0; j < m; j++) if (grid[i][j]) ans = Math.max(ans, trav(i, j)) return ans };
Код Python:
( Перейти к : Описание проблемы Идея решения
class Solution: def maxAreaOfIsland(self, grid: List[List[int]]) -> int: ans, n, m = 0, len(grid), len(grid[0]) def trav(i: int, j: int) -> int: if i < 0 or j < 0 or i >= n or j >= m or grid[i][j] == 0: return 0 grid[i][j] = 0 return 1 + trav(i-1, j) + trav(i, j-1) + trav(i+1, j) + trav(i, j+1) for i, j in product(range(n), range(m)): if grid[i][j]: ans = max(ans, trav(i, j)) return ans
Java код:
( Перейти к : Описание проблемы Идея решения
class Solution { private int n, m; public int maxAreaOfIsland(int[][] grid) { int ans = 0; n = grid.length; m = grid[0].length; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (grid[i][j] > 0) ans = Math.max(ans, trav(i, j, grid)); return ans; } private int trav(int i, int j, int[][] grid) { if (i < 0 || j < 0 || i >= n || j >= m || grid[i][j] < 1) return 0; grid[i][j] = 0; return 1 + trav(i-1, j, grid) + trav(i, j-1, grid) + trav(i+1, j, grid) + trav(i, j+1, grid); } }
C ++ код:
( Перейти к : Описание проблемы Идея решения
class Solution { public: int maxAreaOfIsland(vector>& grid) { int ans = 0; n = grid.size(), m = grid[0].size(); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (grid[i][j]) ans = max(ans, trav(i, j, grid)); return ans; } private: int n, m; int trav(int i, int j, vector >& grid) { if (i < 0 || j < 0 || i >= n || j >= m || !grid[i][j]) return 0; grid[i][j] = 0; return 1 + trav(i-1, j, grid) + trav(i, j-1, grid) + trav(i+1, j, grid) + trav(i, j+1, grid); } };
Оригинал: “https://dev.to/seanpgallivan/solution-max-area-of-island-4njk”