695. 岛屿的最大面积

岛屿的最大面积

题目描述:

给定一个包含了一些 0 和 1 的非空二维数组 grid 。

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

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)

示例 1:

[[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:

[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0。

注意: 给定的矩阵grid 的长度和宽度都不超过 50。

思路:

经典dfs题目,加一个flag【i】【j】,如果访问了就把它置1,这样就不会有回去原来的位置

代码:

func maxAreaOfIsland(grid [][]int) int {
	var max int
	number := 1
	var flag [51][51]int
	move := [][]int{{1, 0}, {0, 1}, {-1, 0}, {0, -1}}
	for i := 0; i < len(grid); i++ {
		for j := 0; j < len(grid[0]); j++ {
			if grid[i][j] != 0 && flag[i][j] == 0 {
				queue := []int{i, j}
				flag[i][j] = 1
				for len(queue) != 0 {
					tmppoint1 := queue[0]
					tmppoint2 := queue[1]
					for _, v := range move {
						if tmppoint1+v[0] >= 0 && tmppoint1+v[0] < len(grid) && tmppoint2+v[1] >= 0 && tmppoint2+v[1] < len(grid[0]) && grid[tmppoint1+v[0]][tmppoint2+v[1]] == 1 && flag[tmppoint1+v[0]][tmppoint2+v[1]] == 0 {
							queue = append(queue, tmppoint1+v[0], tmppoint2+v[1])
							flag[tmppoint1+v[0]][tmppoint2+v[1]] = 1
							number++
						}
					}
					queue = append(queue[2:])
				}
				if number > max {
					max = number
				}
				number = 1
			}

		}
	}
	return max
}

代码效率:

执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2.2 MB, 在所有 Go 提交中击败了100.00%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!