数据结构之岛屿数量
题目信息
给你一个由 ‘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);
}
}
}
}题目链接
相关推荐
waitwolf 2020-07-30
roseying 2020-07-04
koushr 2020-11-12
kikaylee 2020-10-31
范范 2020-10-28
MILemon 2020-10-22
hugebawu 2020-10-12
LauraRan 2020-09-28
shenwenjie 2020-09-24
omyrobin 2020-09-23
guangcheng 2020-09-22
qiangde 2020-09-13
hanyujianke 2020-08-18
晨曦之星 2020-08-14
xiesheng 2020-08-06
KAIrving 2020-08-02
xiesheng 2020-08-02