200. 岛屿数量

左手的ㄟ右手 2024-03-31 09:14 134阅读 0赞

200. 岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1

示例 2:

输入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
输出:3

提示:
  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 ‘0’ 或 ‘1’

思路:(DFS)

网格问题是由 m×nm \times nm×n 个小方格组成一个网格,每个小方格与其上下左右四个方格认为是相邻的,要在这样的网格上进行某种搜索。

岛屿问题是一类典型的网格问题。每个格子中的数字可能是 0 或者 1。我们把数字为 0 的格子看成海洋格子,数字为 1 的格子看成陆地格子,这样相邻的陆地格子就连接成一个岛屿。

在这里插入图片描述
在这样一个设定下,就出现了各种岛屿问题的变种,包括岛屿的数量、面积、周长等。不过这些问题,基本都可以用 DFS 遍历来解决。

步骤:

和 695. 岛屿的最大面积 类似

  • 遍历整个岛屿;
  • 由于只统计岛屿的数量,所以当读到第一个 ‘1’ 时,就可返回是一个岛屿;
  • 第一个‘1’ 返回岛屿后,与该岛屿块四个方向相连的‘1’ 都置位‘0’,以及对这四个方向进行深度优先搜索;
  • 其他四个方向只是置 ‘0’ 操作,无需接收返回值

代码(Java)

  1. public class dfs_nums_land {
  2. public static void main(String[] args) {
  3. // TODO 自动生成的方法存根
  4. // char [][] grid = {
  5. // {'1','1','1','1','0'},
  6. // {'1','1','0','1','0'},
  7. // {'1','1','0','0','0'},
  8. // {'0','0','0','0','0'}
  9. // };
  10. char [][] grid = {
  11. {
  12. '1','1','0','0','0'},
  13. {
  14. '1','1','0','0','0'},
  15. {
  16. '0','0','1','0','0'},
  17. {
  18. '0','0','0','1','1'}
  19. };
  20. int num = numIslands(grid);
  21. System.out.println(num);
  22. }
  23. private static int [][] dircetion = {
  24. {
  25. 1, 0}, {
  26. 0, 1}, {
  27. 0, -1}, {
  28. -1, 0}};
  29. private static int m;
  30. private static int n;
  31. public static int numIslands(char[][] grid) {
  32. if(grid == null || grid.length == 0) {
  33. return 0;
  34. }
  35. m = grid.length;
  36. n = grid[0].length;
  37. int num = 0;
  38. for(int i = 0; i < m; i++) {
  39. for(int j = 0; j < n; j++){
  40. num += isLand(grid, i ,j);
  41. }
  42. }
  43. return num;
  44. }
  45. private static int isLand(char[][] grid, int r, int c) {
  46. // TODO 自动生成的方法存根
  47. if(r < 0 || r >= m || c < 0 || c >= n || grid[r][c] == '0') {
  48. return 0;
  49. }
  50. grid[r][c] = '0';
  51. for(int d[] : dircetion) {
  52. isLand(grid, r + d[0], c + d[1]);
  53. }
  54. return 1;
  55. }
  56. }
输出:

在这里插入图片描述

复杂度分析:
  • 时间复杂度:O(MN),其中 M 和 N 分别为行数和列数。
  • 空间复杂度:O(MN),在最坏情况下,整个网格均为陆地,深度优先搜索的深度达到 MN。
注:仅供学习参考!

来源:力扣

发表评论

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

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

相关阅读

    相关 200. 岛屿数量

    200. 岛屿数量 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上

    相关 leetcode200. 岛屿数量

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包

    相关 【leetcode.200岛屿数量

    一、题目描述 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地

    相关 LeetCode200. 岛屿数量

    题目难度:中等 题目描述: > 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 > 岛屿总是被水包围,并且每座岛屿只能由水平方

    相关 200. 岛屿数量

    > 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 > > 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接