python系列文章目录
【python】基于cv2提取图片上的文本内容
【python】简单作图
【python】数组字符串等实用
【python】sort与sorted排序使用
【python】对角线遍历
说明
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:
输入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
输出:3
1.分析
对于示例1, 4 x 5 的矩阵,岛屿分布如下矩阵所示,岛屿数量是"1" 连接在一起的块数,即为3。
[
"
1
"
"
1
"
"
1
"
"
1
"
"
1
"
"
1
"
"
1
"
]
\left[\begin{array}{c|c|c|c|c} "1" & "1" & & & \\ \hline "1" & "1"& \\ \hline & & "1"\\ \hline & & & "1" & "1" \\ \end{array}\right]
"1""1""1""1""1""1""1"
对于矩阵的任意一个坐标[row][col],如何去找到与其连接的"1" 呢?需要考虑该坐标的上下左右四个坐标,而且需要满足不能坐标溢出,即:
- r o w − 1 ≥ 0 row -1\geq0 row−1≥0
- c o l − 1 ≥ 0 col -1\geq0 col−1≥0
- r o w + 1 < 行数 row + 1<行数 row+1<行数
- c o l + 1 < 列数 col + 1<列数 col+1<列数
[ r o w − 1 , c o l r o w , c o l − 1 r o w , c o l r o w , c o l + 1 r o w + 1 , c o l ] \left[\begin{array}{c|c|c} & row -1, col & \\ \hline row, col -1&row, col&row, col +1 \\ \hline & row +1, col & \\ \end{array}\right] row,col−1row−1,colrow,colrow+1,colrow,col+1
2.注意事项
2.1 遍历
遍历过的坐标可以作为标记已经遍历,如下代码证定义一个与矩阵同样大小的零矩阵,如果已经遍历过,则labels[row][col] = 1
2.2 区间
行列坐标不能溢出
2.3 计数
如果遍历到某个坐标的值为“1”,则满足岛屿的条件,count += 1。可以去搜索去四周的坐标是否为“1”,如果四周的坐标为“1”,则需要标记,避免重复count。
3.代码实现
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
rows = len(grid)
cols = len(grid[0])
labels = [[0 for i in range(cols)] for j in range(rows)]
def search(row, col):
labels[row][col] = 1
#up
if row - 1 >= 0 and labels[row-1][col] == 0 and grid[row-1][col] == '1':
labels[row-1][col] = 1
search(row-1, col)
#down
if row + 1 < rows and labels[row+1][col] == 0 and grid[row+1][col] == '1':
labels[row+1][col] == 1
search(row+1, col)
#left
if col - 1 >= 0 and labels[row][col-1]== 0 and grid[row][col-1] == '1':
labels[row][col-1]=1
search(row, col - 1)
#right
if col + 1 < cols and labels[row][col+1]==0 and grid[row][col+1] == '1':
labels[row][col+1]=1
search(row, col+1)
count = 0
for row in range(rows):
for col in range(cols):
if grid[row][col] == '1' and labels[row][col] == 0:
count += 1
search(row, col)
return count