今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

算法_岛屿的最大面积

733. 算法_岛屿的最大面积#

给定一个 m x n 的二进制矩阵 grid,岛屿是由四个方向(水平或垂直)上相邻的 1(表示陆地)组成的。假设网格的四个边缘都被水包围。

岛屿的面积是指岛上值为 1 的单元格的数目。

返回 grid 中最大的岛屿面积。如果没有岛屿,则返回 0。

示例 1:

示例图片

输入: grid = [[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,因为岛屿必须是四个方向相邻的。

示例 2:

输入: grid = [[0,0,0,0,0,0,0,0]]
输出: 0

解法#

和 FloodFill 算法类似,只不过这里不是把相邻的改为一样的颜色,而是计算相邻的 1 的个数。解法是:遍历数组,如果当前元素为 1,则计算这个元素周边的 1 的个数 —— 通过递归,获取相邻元素的值,为 1 的个数相加,并且把当前元素改为 0,避免重复计算。

代码如下:


class Solution {
    func maxAreaOfIsland(_ grid: [[Int]]) -> Int {
        var maxArea = 0
        for i in 0..<grid.count {
            for j in 0..<grid[i].count {
                if grid[i][j] == 1 {
                    // 当前为1,则计算周围为1的总数
                    var newGrid = grid
                     maxArea = max(maxArea, calculateMaxArea(&newGrid, i, j))
                }
            }
        }
        return maxArea
    }
    
    func calculateMaxArea(_ grid: inout [[Int]], _ i: Int, _ j: Int) -> Int {
        if i >= 0 && i < grid.count && j >= 0 && j < grid[i].count && grid[i][j] == 1 {
            grid[i][j] = 0
            return 1 + calculateMaxArea(&grid, i-1, j) + calculateMaxArea(&grid, i+1, j) + calculateMaxArea(&grid, i, j-1) + calculateMaxArea(&grid, i, j+1)
        }
        return 0
    }
}

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。