• 数据结构之岛屿数量


    题目信息

    给你一个由 '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);
                }
            }
        }
    }

    题目链接

  • 相关阅读:
    思考--连续的还是跳跃的?(二)
    方法学导论--by 有只茄子
    时空、维度,以及其他(一)
    处理问题的方法--抽象和特例化
    tomcat server 152主机.xml
    java怎么重写覆盖Spring Bean的几种方式
    maven上传jar到私服
    sql_mode=only_full_group_by
    spring何时创建bean
    mysql 快速备份数据库
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/12745567.html
Copyright © 2020-2023  润新知