Рубрики
Без рубрики

Решение: Максимальная площадь острова

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или Фу … помечены алгоритмами, JavaScript, Java, Python.

Это является частью серии объяснений решения 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”