lotus

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

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1846 随笔 :: 0 文章 :: 109 评论 :: 288万 阅读

1. 题目

读题

 

考查点

 

2. 解法

思路

思路是这样的:

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

 

具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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   白露~  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2019-05-02 设计模式:迭代器模式(Iterator)
2019-05-02 设计模式:解释器模式(Interpreter)
2019-05-02 设计模式:命令模式(Command)
2019-05-02 设计模式:职责链模式(Chain of Responsibility)
2019-05-02 设计模式:单例模式(单例模式)
2019-05-02 设计模式:原型模式(Prototype)
2019-05-02 浅析java的浅拷贝和深拷贝
点击右上角即可分享
微信分享提示