刷题使我快乐,满脸开心.jpg

  • 来源:力扣(LeetCode)
  • 链接:https://leetcode.cn/problems/max-area-of-island/
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目

给你一个大小为 m x n 的二进制矩阵 grid

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 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 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。

示例 2:

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

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 50
  • grid[i][j]01

思路

这道题其实应该算是比较简单的了,感觉需要说的重点就在于如何记录已经遍历过这个点了

通常做法可能是维护一个是否遍历的矩阵,但是其实这道题的情况下会有一个更取巧的做法:

可以把已经记入某个岛屿的方块值置为 0

这样一来,就可以不需要额外的空间来做记录了。
剩下的感觉没太多要说的了。

代码

func maxAreaOfIsland(grid [][]int) int {
	res := 0
	m := len(grid)
	n := len(grid[0])

	var find func(x, y int) int
	find = func(x, y int) int {
		if x < 0 || x >= m || y >= n || y < 0 || grid[x][y] == 0 {
			return 0
		}
        // 四个方向遍历,记入面积并将当前位置值记为0
		grid[x][y] = 0
		return 1 + find(x-1, y) + find(x, y-1) + find(x+1, y) + find(x, y+1)
	}

	temp := 0
    // 一个个坐标遍历,发现 1 进入计算面积逻辑
    for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			if grid[i][j] == 1 {
                // 遍历完此岛屿,则比较面积大小更新最大面积数
                temp = find(i, j)
				if temp > res {
					res = temp
				}
			}
		}
	}
	return res
}