Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
岛屿的最大面积
题目
给你一个大小为 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.lengthn == grid[i].length1 <= m, n <= 50grid[i][j]为0或1
Related Topics
- 深度优先搜索
- 广度优先搜索
- 并查集
- 数组
- 矩阵
题目分析
代码实现
这是代码的实现:
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int result = 0;
for (int i=0;i<grid.length;i++) {
for (int j=0;j<grid[i].length;j++) {
if (grid[i][j] ==1) {
result = Math.max(result,dfs(i,j,grid));
}
}
}
return result;
}
private int dfs (int i, int j, int[][]grid) {
if (i<0 || j<0 || i>= grid.length || j>= grid[i].length || grid[i][j] ==0) {
return 0;
}
grid[i][j] =0;
int num =1;
num += dfs(i+1,j,grid);
num += dfs(i-1,j,grid);
num += dfs(i,j+1,grid);
num += dfs(i,j-1,grid);
return num;
}
}
这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉图的深度优先遍历的使用和操作。
这道题同样用了深度优先遍历,和上次的题目类似,这里有个思想就是沉岛思想,就是对于遍历过的岛屿改为0,防止下次遍历,这就是沉岛的思想。一道题目往往有很多种解法,我选择了一种适合我的解法,当然也可以使用广度优先来进行求得这个问题。
小知识
java异常体系顶层父类是Throwable,它的子类有Exception和Error,Error一般是程序被迫停止的错误,就是跑不起来了🏃🏻♀️,Exception分为RuntimeException运行时异常和CheckedException检查异常,检查异常就是编译不通过的异常
总结
本篇文章主要解决了岛屿的最大面积的问题,这道题目和图像渲染的题目类似,并提出了一个沉岛思想,就是对遍历过的岛屿让它沉没,这样下次遍历的时候就不需要遍历了,防止重复,然后在小知识模块介绍了java的异常体系的知识点,异常是我们工作中不可避免的,谁工作不写bug啊,嘿嘿,对于这道题目的广度优先遍历,感兴趣的小伙伴们尝试自行解决实现一下吧,嘿嘿,多动脑,勤思考。