leetCode 岛屿问题

97 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

算法 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