本文已参与「新人创作礼」活动,一起开启掘金创作之路
算法 leetCode 岛屿问题
岛屿数量 问题描述 给定一个有’1‘(陆地)和’0‘组成的二维网格 计算到预计的数量。 一个岛被水包围而成,并且它是通过水平方向相邻的陆地链接而成的
输入:
11110
11010
11000
00000
输出:1
输入
11000
11000
00100
00011
输出 3
对应这类的题目我们一般有两种思路,一种是深度优先搜索(DFS),一种是广度优先搜索(BFS)
算法一 深度优先搜索
lands = 0
def dfs(lst, r, c):
nr = len(lst)
nc = len(lst[0])
lst[r][c] = 0
# 四种移动方向
if r-1 >= 0 and lst[r-1][c]==1:
dfs(lst, r-1,c)
if r+1 < nr and lst[r+1][c]==1:
dfs(lst, r+1,c)
if c-1 >= 0 and lst[r][c-1]==1:
dfs(lst, r,c-1)
if c+1 < nc and lst[r][c+1]==1:
dfs(lst, r,c+1)
lst = [[1,1,1,1,0],[1,1,1,1,0],[1,1,0,0,0],[0,0,1,0,1,]]
nr = len(lst)
nc = len(lst[0])
num_islands = 0
for r in range(nr):
for c in range(nc):
if lst[r][c] == 1:
num_islands +=1
dfs(lst, r, c)
print(num_islands)
算法二 广度优先搜索
lst = [[1,1,1,1,0],[1,1,1,1,0],[1,1,0,0,0],[0,0,1,0,1,]]
nr = len(lst)
nc = len(lst[0])
num_islands = 0
for r in range(nr):
for c in range(nc):
if lst[r][c] == 1:
num_islands +=1
lst[r][c] = 0
from collections import deque
from django.db.migrations import graph
2
def search(name):#广度优先搜索(BFS)
# deque()函数创建一个双端队列(先进先出)
# 注意deque是python标准库cillections中的一个模块
search_quene = deque()
search_quene += graph[name]
# 创建空列表的目的:为了防止后边添加到队列里的元素与之前的重复出现
# 所以我加入一个空列表,将判断完成的数据添加的这个列表,将准备进入列表的数据与这个列表元素对比,确保没有重复元素再次进入队列,防止无限循环产生
searched = []
while search_quene:
# 队列中,pop()默认抛出右边元素,但是我们希望,append()从右边入队,popleft()从左边出队
person = search_quene.popleft()
if person not in searched:
#person_is_not()是一个判断函数,我们需要判断我们查找的内容是否满足我们的需求
if person_is_not(person):
print (person+" is this")
return True
else:
search_quene += graph[person]
searched.append(person)
return False