• LeetCode 刷题系列 -- 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'

    来源:力扣(LeetCode
    链接:https://leetcode.cn/problems/number-of-islands
     

    思路:

    此题需要用到图的深度遍历 dfs。
    我们可以遍历这个二维数组,若是某个格子的值为 1,
    说明我们遇到了岛屿,记录岛屿的 count 自增 1;
    同时我们相邻的其他 1 都置为0,即该岛屿下次不再记录了
     https://labuladong.github.io/algo/2/22/50/

    图深度遍历框架:

    1. // 记录被遍历过的节点
    2. boolean[] visited;
    3. // 记录从起点到当前节点的路径
    4. boolean[] onPath;
    5. /* 图遍历框架 */
    6. void traverse(Graph graph, int s) {
    7. if (visited[s]) return;
    8. // 经过节点 s,标记为已遍历
    9. visited[s] = true;
    10. // 做选择:标记节点 s 在路径上
    11. onPath[s] = true;
    12. for (int neighbor : graph.neighbors(s)) {
    13. traverse(graph, neighbor);
    14. }
    15. // 撤销选择:节点 s 离开路径
    16. onPath[s] = false;
    17. }

    java:

    1. class Solution {
    2. public int numIslands(char[][] grid) {
    3. int result = 0;
    4. int m = grid.length;
    5. int n = grid[0].length;
    6. boolean[][] visited = new boolean[m][n];
    7. for (int i=0;i< grid.length;i++) {
    8. for(int j=0;j<grid[0].length;j++) {
    9. if(grid[i][j] == '1') {
    10. result += 1;
    11. dfs(grid,i,j,visited);
    12. }
    13. }
    14. }
    15. return result;
    16. }
    17. public void dfs(char[][] grid, int i, int j,boolean[][] visited) {
    18. // 越界的 i 与 j 不需要再遍历,及时终止即可
    19. if(i<0 || j<0 || i>grid.length-1 || j > grid[0].length-1) {
    20. return;
    21. }
    22. // 当前格子为 '0' 或者被遍历过,则停止遍历
    23. if(grid[i][j] == '0' || visited[i][j]) {
    24. return;
    25. }
    26. grid[i][j] = 0;
    27. // 访问过的格子要标记为 true,避免下次被重复访问
    28. visited[i][j] = true;
    29. dfs(grid,i-1,j,visited);
    30. dfs(grid,i,j-1,visited);
    31. dfs(grid,i+1,j,visited);
    32. dfs(grid,i,j+1,visited);
    33. }
    34. }

    c++

    1. class Solution {
    2. public:
    3. int numIslands(vector<vector<char>>& grid) {
    4. int result = 0;
    5. int row = grid.size();
    6. int col = grid[0].size();
    7. vector<vector<bool>> visited(row,vector(col));
    8. for (int i=0;i<row;i++) {
    9. for(int j=0;j<col;j++) {
    10. if(grid[i][j] == '1') {
    11. result+=1;
    12. dfs(grid,visited,i,j);
    13. }
    14. }
    15. }
    16. return result;
    17. }
    18. // 当前的 grid[i][j] 为1 的话,将与其相邻的所有1都置为 0
    19. void dfs(vector<vector<char>>& grid, vector>& visited, int i, int j) {
    20. // 超出边界直接 return
    21. if (i<0 || i >= grid.size() || j<0 || j>= grid[0].size()) {
    22. return;
    23. }
    24. // 遍历过的不再重复遍历,为 0 节点也不再遍历
    25. if(visited[i][j] || grid[i][j] == '0') {
    26. return;
    27. }
    28. // 标记遍历过的节点为 true
    29. visited[i][j] = true;
    30. //1 改为 0
    31. grid[i][j] = '0';
    32. dfs(grid,visited,i-1,j);
    33. dfs(grid,visited,i+1,j);
    34. dfs(grid,visited,i,j-1);
    35. dfs(grid,visited,i,j+1);
    36. }
    37. };

  • 相关阅读:
    无涯教程-JavaScript - CHISQ.INV.RT函数
    HTML5、CSS3、ES6新特性总结
    网络服务ftp实验
    牛客项目(五)-使用kafka实现发送系统通知
    Servlet快速筑基
    Java中ArrayList 和 LinkedList 的区别
    上位机工作感想-从C#到Qt的转变-2
    python coding with ChatGPT 打卡第21天| 二叉树:最近公共祖先
    ​统信UOS丨开机无法进入系统丨进阶操作
    基于Unity引擎的RPG3D项目开发笔录
  • 原文地址:https://blog.csdn.net/qq_33775774/article/details/126692439