lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. 题目

读题

 

考查点

 

2. 解法

思路

思路是这样的:

  • 首先,我把网格看作一个无向图,每个1是一个节点,每个相邻的1之间有一条边。
  • 然后,我用一个变量count来记录岛屿的数量,初始值为0。
  • 接着,我遍历网格中的每个位置,如果当前位置是1,就说明找到了一个新的岛屿,然后我把count加一,并且用深度优先搜索来遍历这个岛屿上的所有节点,把它们都标记为已访问,也就是把它们的值改为0。
  • 最后,我返回count作为答案。

 

具体实现

class Solution {
    public int numIslands(char[][] grid) {
        // 边界条件判断
        if (grid == null || grid.length == 0) {
            return 0;
        }
        // 获取行数和列数
        int m = grid.length;
        int n = grid[0].length;
        // 定义岛屿数量
        int count = 0;
        // 遍历网格
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                // 如果当前位置是1,就进行深度优先搜索,并且岛屿数量加一
                if (grid[i][j] == '1') {
                    dfs(grid, i, j);
                    count++;
                }
            }
        }
        // 返回岛屿数量
        return count;
    }

    // 深度优先搜索,把当前位置和相邻的1都标记为已访问
    private void dfs(char[][] grid, int i, int j) {
        // 边界条件判断
        if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == '0') {
            return;
        }
        // 把当前位置标记为已访问
        grid[i][j] = '0';
        // 遍历上下左右四个方向
        dfs(grid, i - 1, j);
        dfs(grid, i + 1, j);
        dfs(grid, i, j - 1);
        dfs(grid, i, j + 1);
    }
}

  

 

3. 总结

posted on 2023-05-02 19:27  白露~  阅读(10)  评论(0编辑  收藏  举报