最新华为OD机试
题目描述
给你一个由 大于0的数(陆地)和 0(水)组成的的二维网格,请你计算网格中最大岛屿的体积。陆地的数表示所在岛屿的体积。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
输入描述
第一行是二维网格的宽和高。
后面几行是二维网格。
输出描述
输出岛屿的最大体积。
示例1
输入
3 3
0 0 0
0 0 0
0 0 0
输出
0
说明
示例2
输入
5 3
1 0 1 0 1
1 0 1 0 1
1 0 1 0 1
输出
3
说明
解题思路
1. 问题本质
这个问题本质上是在求解一个连通分量的最大值问题:
- 网格中每个值大于0的单元格可视为一个节点
- 两个相邻(上下左右四个方向)的节点构成连接关系
- 需要找出网格中体积最大的连通分量
2. 算法详解
2.1 遍历与标记策略
- 使用双层循环遍历整个网格的每个单元格
- 对每个未访问的陆地单元格(值>0),启动一次DFS
- 使用布尔数组
visited[][]
标记已经访问过的单元格,避免重复计算
2.2 DFS实现细节
-
基本情况处理:
- 当索引越界时返回0
- 当单元格已被访问过时返回0
- 当单元格是水域(值为0)时返回0
-
递归探索过程:
- 标记当前单元格为已访问
- 记录当前单元格的体积值
- 递归探索四个方向的相邻单元格
- 将当前单元格和所有相邻连通单元格的体积累加起来
2.3 最大值更新机制
- 每完成一次DFS,就得到一个完整岛屿的体积
- 使用变量
maxVolume
记录已发现的最大岛屿体积 - 每次DFS结束后,将新计算的岛屿体积与当前最大值比较并更新
Java
import