200. 岛屿数量

本文介绍了如何使用深度优先搜索(DFS)和广度优先搜索(BFS)算法解决LeetCode上的问题,计算给定由‘1’和‘0’组成的二维网格中岛屿的数量。两种方法都展示了如何遍历并标记陆地区域,以计算有效岛屿的数量。
摘要由CSDN通过智能技术生成

题目-中等难度

给你一个由 ‘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/summary-ranges
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1. dfs

时间
108ms
击败 78.12%使用 Python3 的用户
内存
25.87MB
击败 72.49%使用 Python3 的用户

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        # 获取网格长宽
        lg,lgg = len(grid),len(grid[0])
        # 递归填充网格内为1的项
        def dfs(grid,x,y):
            # 确保x,y在网格中, 并且当前网格值为1
            if (0<=x<lg and 0<=y<lgg and grid[x][y]=='1'):
                # 将网格变化为0
                grid[x][y] = '0'
                # 对相邻网格为1的进行填充
                dfs(grid,x+1,y)
                dfs(grid,x-1,y)
                dfs(grid,x,y+1)
                dfs(grid,x,y-1)
        # 计数
        c = 0
        # 遍历网格
        for m in range(lg):
            for n in range(lgg):
                # 若当前网格值为1
                if grid[m][n] == '1':
                    # 递归填充
                    dfs(grid,m,n)
                    # 计数+1
                    c+=1
        # 返回计数
        return c

2. bfs

时间
112ms
击败 70.03%使用 Python3 的用户
内存
25.75MB
击败 88.17%使用 Python3 的用户

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        # 获取网格长宽
        lg,lgg = len(grid),len(grid[0])
        # 计算
        res = 0
        # 遍历网格
        for i in range(lg):
            for j in range(lgg):
                # 如果网格值为1
                if grid[i][j] == '1':
                    # 添加至li列表开始广度优先搜索
                    li = [(i,j)]
                    while li:
                        # 获取当前网格
                        x,y = li.pop(0)
                        # 由于广度优先会存在一种情况,如li列表中的网格已经将'1'变为'0'的情况, 所以需要跳过
                        if grid[x][y] == '0':
                            continue
                        # 将当前网格值替换为0
                        grid[x][y] = '0'
                        # 对网格进行搜索
                        for xx,yy in [(x+1,y),(x,y+1),(x-1,y),(x,y-1)]:
                            if 0<=xx<lg and 0<=yy<lgg and grid[xx][yy] == '1':
                                li.append((xx,yy))
                    res += 1
        return res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值