Lever's Castle

695. 岛屿的最大面积

December 09, 2018

https://leetcode-cn.com/problems/max-area-of-island/

使用语言: Golang

func maxAreaOfIsland(grid [][]int) int {
    max := 0
    for i:=0; i<len(grid); i++ {
        for j:=0; j<len(grid[i]); j++ {
            if grid[i][j] == 1 {
                _max := _maxAreaOfIsLand(grid, i, j)
                if max < _max {
                    max = _max
                }
            }
        }
    }
    return max
}

func _maxAreaOfIsLand(grid [][]int, i int, j int) int {
    if i >= 0 && j >= 0 && i < len(grid) && j < len(grid[i]) && grid[i][j] == 1 {
        // 计算过的陆地重置为 0
        grid[i][j] = 0
        return 1 + _maxAreaOfIsLand(grid, i + 1, j) + _maxAreaOfIsLand(grid, i, j + 1) + _maxAreaOfIsLand(grid, i - 1, j) + _maxAreaOfIsLand(grid, i, j - 1)
    }
    return 0
}

解题思路

要求岛屿的最大面积,那就需要知道所有岛屿的面积,那么这个问题的子问题就变成求解每个岛屿的面积。

这个子问题还可以继续分解,要求一个岛屿的面积,就是岛屿上每个点的面积 (1) 之和,那我们就要从岛屿的一个点为起点,遍历整个岛,求得面积。有了起点怎么找到岛屿上的其他点呢?这就要看岛屿的定义了:一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合

这意味着,这个点的上下左右,值为 1 的点就是岛屿上的点。

那么我们的这个求面积的函数要解决的最小子问题就是一个点的面积,这个点要满足的条件是值为 1,值不唯一,面积就是 0。

然后从这个点,向它的四面递归,求得整个岛屿的面积。因为有可能会从多个方向抵达同一个点,所以我们要把已经算过的点,重置为 0,这样就不会重复计算了。


Lever

痕迹
没有过去,就没法认定现在的自己