695. 岛屿的最大面积

古城微笑少年丶 2024-03-31 08:50 193阅读 0赞

695. 岛屿的最大面积

给你一个大小为 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] 为 0 或 1

思路(DFS):

在这里插入图片描述

  • 广度优先搜索一层一层遍历,每一层得到的所有新节点,要用队列存储起来以备下一层遍历的时候再遍历。
  • 而深度优先搜索在得到一个新节点时立即对新节点进行遍历:从节点 0 出发开始遍历,得到到新节点 6 时,立马对新节点 6 进行遍历,得到新节点 4;如此反复以这种方式遍历新节点,直到没有新节点了,此时返回。返回到根节点 0 的情况是,继续对根节点 0 进行遍历,得到新节点 2,然后继续以上步骤。

从一个节点出发,使用 DFS 对一个图进行遍历时,能够遍历到的节点都是从初始节点可达的,DFS 常用来求解这种 可达性 问题。

在程序实现 DFS 时需要考虑以下问题:

  • 栈:用栈来保存当前节点信息,当遍历新节点返回时能够继续遍历当前节点。可以使用递归栈。
  • 标记:和 BFS 一样同样需要对已经遍历过的节点进行标记。

代码(Java):

  1. public class dfs_max_area {
  2. public static void main(String[] args) {
  3. // TODO 自动生成的方法存根
  4. int [][] grid = {
  5. {
  6. 0,0,1,0,0,0,0,1,0,0,0,0,0},
  7. {
  8. 0,0,0,0,0,0,0,1,1,1,0,0,0},
  9. {
  10. 0,1,1,0,1,0,0,0,0,0,0,0,0},
  11. {
  12. 0,1,0,0,1,1,0,0,1,0,1,0,0},
  13. {
  14. 0,1,0,0,1,1,0,0,1,1,1,0,0},
  15. {
  16. 0,0,0,0,0,0,0,0,0,0,1,0,0},
  17. {
  18. 0,0,0,0,0,0,0,1,1,1,0,0,0},
  19. {
  20. 0,0,0,0,0,0,0,1,1,0,0,0,0}
  21. };
  22. int num = maxAreaOfIsland(grid);
  23. System.out.println(num);
  24. }
  25. private static int m;
  26. private static int n;
  27. private static int [][] direction = {
  28. {
  29. 0,1},{
  30. 1,0},{
  31. -1,0},{
  32. 0,-1}};
  33. public static int maxAreaOfIsland(int[][] grid) {
  34. if(grid == null || grid.length == 0) {
  35. return 0;
  36. }
  37. m = grid.length;
  38. n = grid[0].length;
  39. int maxArea = 0;
  40. for(int i = 0; i < m; i++) {
  41. for(int j = 0; j < n; j++) {
  42. maxArea = Math.max(maxArea, dfs(grid, i, j));
  43. }
  44. }
  45. return maxArea;
  46. }
  47. private static int dfs(int[][] grid, int r, int c) {
  48. // TODO 自动生成的方法存根
  49. if(r < 0 || r >= m || c < 0 || c >= n || grid[r][c] == 0) {
  50. return 0;
  51. }
  52. grid[r][c] = 0;//标记已经访问
  53. int area = 1;
  54. for(int [] d: direction) {
  55. //只有四个方向可以走,类似于栈
  56. area += dfs(grid, r + d[0], c + d[1]);
  57. }
  58. return area;
  59. }
  60. }
运行结果:

在这里插入图片描述

复杂度分析:
  • 时间复杂度:O(m×n)。其中 m 是给定网格中的行数,n 是列数。我们访问每个网格最多一次。
  • 空间复杂度:O(m×n),递归的深度最大可能是整个网格的大小,因此最大可能使用 O(m×n) 的栈空间。
注:仅供学习参考

来源:力扣

发表评论

表情:
评论列表 (有 0 条评论,193人围观)

还没有评论,来说两句吧...

相关阅读

    相关 695. 岛屿面积

    > 给定一个包含了一些 0 和 1 的非空二维数组 grid 。 > > 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者

    相关 695. 岛屿面积

    给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着