岛屿数量 递归

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

思路:

  岛屿数量这一类题(给一个二维数组,数个数、找路径之类的)考察得还是挺多的,因为这一类题是考察深度优先搜索、宽度优先搜索、递归之类操作的重点。不过这只是我自己大概的一个感觉哈,我们直接来看这个题,每一块挨着的1们就是一个岛屿,我们需要找有几个独立的“1块”即可。

  我们可以用非常简单粗暴的方法,因为每一个岛屿周围必然都是0,则我们可以用“炸弹填平法”(我自己起的名哈哈)。我们遍历这个二维数组,每次遇到1,我们就相当于遇到了岛屿,则我们把这个岛屿直接“炸成”海洋,假设我们的炸弹只能以陆地作为介质传播,则炸一次,就可以解决掉一个岛屿,岛屿数量+1。

  具体到代码中,由一个位置1向周围扩散,假如是1则变成0再继续扩散,直到扩散不动为止,用递归的方式来做即可。

代码:

class Solution(object):

    def numIslands(self, grid):

        m = len(grid) #获得二维矩阵的长和宽

        n = len(grid[0])

        num = [0]#用一个列表充当全局变量

        def dfs(i,j):#从i,j这一点开始,对整个岛屿进行填平

            if i<0 or i>=m or j<0 or j>=n:#定义base case

                return #如果走到了边界外位置直接返回

            if grid[i][j]=='1':#如果当前位置是陆地

                grid[i][j]=0#填平

                #并且向周围四个方向扩散做同样操作

                dfs(i-1,j)

                dfs(i+1,j)

                dfs(i,j-1)

                dfs(i,j+1)

        for i in range(m):#遍历二维数组当中的每一个位置

            for j in range(n):

                if grid[i][j]=='1':#如果遇到陆地

                    dfs(i,j)#通过一个dfs操作,不管岛屿多大都变成海洋

                    num[0]+=1#解决了一个岛屿,岛屿数量+1

        return num[0]

小结:

  这道题通过递归解决起来还是挺方便的,不管岛屿多大,都全权交给递归去变成海洋。代码中又一次使用了长度为1的数组充当全局变量这一小技巧,否则容易报找不到变量的问题。

posted @   JunanP  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示