zoukankan      html  css  js  c++  java
  • leetcode算法题基础(二十一)广度优先(三)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
     

    提示:

    m == grid.length
    n == grid[i].length
    1 <= m, n <= 300
    grid[i][j] 的值为 '0' 或 '1'

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/number-of-islands
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    BFS算法思路:
    建立一个mark数组,记录grid中满足条件的陆地‘1’对应的位置是否已被访问。建立一个队列,搜索使用。
    (1)设置搜索队列Q(或能够满足FIFO的其他数据结构),标记mark[x][y]为1,并将待搜索的位置(x,y)push进入队列Q。

    
    

    (2)只要队列不为空,则取队头元素,按照方向数组的4个方向,拓展4个新位置newx,newy。

    
    

    (3)若新位置不在地图范围内, 则忽略。

    
    

    (4)如果新位置未曾到达过(mark[newx][newy]为0)、 且是陆地(grid[newx][newy]为“1”),该新位置push进入队列, 并标记mark[newx][newy] = 1。

    class Solution(object):
        def numIslands(self, grid):
            """
            :type grid: List[List[str]]
            :rtype: int
            """
            res = 0
            if len(grid) == 0:
                return res
            m = len(grid)
            n = len(grid[0])
    
            mark = [[0] * n for i in range(m)]
    
            for i in range(m):
                for j in range(n):
                    if mark[i][j] == 0 and grid[i][j] == '1':
                        self.bfs(mark, grid, i, j)
                        res += 1
            return res
    
        # 深度优先搜索:时间优于宽度优先搜索
        def bfs(self, mark, grid, x, y):
            Q = []
            Q.append([x,y])
            mark[x][y] = 1
            dx = [-1, 1, 0, 0]  # 方向数组
            dy = [0, 0, -1, 1]
            m = len(grid)
            n = len(grid[0])
            # 遍历上下左右四个方向
            while Q:
                temp = Q.pop(0)
                x = temp[0]
                y = temp[1]
                for i in range(4):
                    newx = dx[i]+x
                    newy = dy[i]+y
                    if newx < 0 or newx >= m or newy >= n or newy < 0:
                        continue
                    if mark[newx][newy] == 0 and grid[newx][newy] == '1':
                        Q.append([newx, newy])  # 将新位置进入队列
                        mark[newx][newy] = 1

    本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/14003569.html

  • 相关阅读:
    【Android】给Android Studio设置代理
    Android studio如何使用SVN进行版本控制?
    Android studio
    nohup java -jar 启动java项目
    Linux命令发送Http GET/POST请求
    Java 读取配置文件的几种方式
    java -jar 报错 Error: A JNI error has occurred, please check your installation and try again
    java.net 发送http请求
    textarea高度自适应
    webrtc切换媒体设备
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14003569.html
Copyright © 2011-2022 走看看