力扣200. 岛屿数量
力扣刷题 21

200. 岛屿数量

过年也太忙了,这几天基本没着家😇😇😇,我也是晚上抽时间做,所以每天比较晚
原题,题目描述:
5a5ec562-3157-485c-bb8f-e35393994878.png
给了一个用邻接矩阵表示的图,其中1表示陆地,0表示水域,让我计算有多少个岛,连在一起的都算一个岛,🆓上下左右连接才算,斜着不能连接。这个题力扣划到中等,不过力扣的中等题的难度我只能说上下限差得有点多。这题我认为其实是不难的,我看到这题的第一思路就是深度优先搜索,遍历到的点就设为已经遍历过,我们把图里的点改为'2',这样就行。下面是我的代码:

class Solution {
    private int numIslandsNum = 0;

    public int numIslands(char[][] grid) {
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == '1') {
                    numIslandsNum++;
                    numIslandsDfs(grid, i, j);
                }
            }
        }
        return numIslandsNum;
    }

    public void numIslandsDfs(char[][] grid, int i, int j) {
        if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] != '1') {
            return;
        }
        grid[i][j] = '2';
        numIslandsDfs(grid, i, j - 1);
        numIslandsDfs(grid, i, j + 1);
        numIslandsDfs(grid, i - 1, j);
        numIslandsDfs(grid, i + 1, j);
    }
}

时间复杂度是O(mn),空间复杂度也是O(mn),不过遍历一个2维数组无论如何都得O(mn)。提交打败了百分之95,不过我看了一下提交为2ms的人的代码,其实是同一套,只有一点细微差别。代码简单明了。如果不理解的话可以评论区留言。

力扣200. 岛屿数量
https://www.than.pw/archives/%E5%8A%9B%E6%89%A3200.-%E5%B2%9B%E5%B1%BF%E6%95%B0%E9%87%8F
作者
than
发布于
更新于
许可