• 数据结构之岛屿数量


    题目信息

    给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
    岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
    此外,你可以假设该网格的四条边均被水包围。
    输入示例:
        输入:
        11110
        11010
        11000
        00000
        输出: 1
    
        输入:
        11000
        11000
        00100
        00011
        输出: 3
    解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

    解题思路

    利用广度优先搜索,遍历这个二维数组,找到为1的数据将其赋值为2(2代表已经遍历过),
    同时遍历该数据的上下左右,将所有为1的数据赋值为2,并将计数加一。直至遍历结束

    代码

    class land {
        // 1为岛屿 0为海 2代表已经遍历过得数据
        let flag: Character = "2";
        let water: Character = "0";
        let land: Character = "1";
        // 用来保存二维数据的行数和列数
        var width = 0;
        var height = 0;
        // 下面两个数组用来遍历一个数据的上下左右
        let xArray = [-1, 1, 0, 0];
        let yArray = [0, 0, -1, 1];
        
        func numIslands(_ grid: [[Character]]) -> Int {
            if grid.isEmpty {
                return 0;
            }
            var map = grid
            width = grid.first?.count ?? 0;
            height = grid.count;
            var number = 0;
            
            for row in 0..<height {
                for col in 0..<width {
                    if map[row][col] == land {
                        number += 1;
                        // 遍历为岛屿数据的上下左右
                        traverseMap(&map, row: row, col: col);
                    }
                }
            }
            return number;
        }
        
        func traverseMap(_ map: inout [[Character]], row: Int, col: Int) {
            // 将遍历过原本为岛屿的数据赋值为falg
            map[row][col] = flag;
            var nextRow: Int = 0;
            var nextCol: Int = 0;
            // 分别往该数据的上下左右遍历
            for i in 0..<xArray.count {
                nextRow = row + xArray[i];
                nextCol = col + yArray[i];
                if nextRow >= 0 && nextRow < height && nextCol >= 0 && nextCol < width && map[nextRow][nextCol] == land {
                    traverseMap(&map, row: nextRow, col: nextCol);
                }
            }
        }
    }

    题目链接

  • 相关阅读:
    常用的正则表达式
    VScode格式化代码,开启ESlint代码检测方法,eslint代码配置
    git 常用的操作
    vscode 格式化的时候自动添加分号怎么去除
    echarts渐变色实现方法
    echart 柱状图 数值较小的时候,文字显示不全
    iview的Modal在提交表单时确认按钮loading状态冲突问题解决方案
    vue.js动态获取菜单
    12.18 webSocket消息推送
    12.18 微信模板消息推送
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/12745567.html
Copyright © 2020-2023  润新知