算法训练营09-深度优先和广度优先

1. 题目

实战题目
二叉树层级遍历102
最小基因变化433
括号生成22
每一层当中的最大节点515

课后作业
127 单词接龙
126 单词接龙2
岛屿的数量200
529 扫雷游戏 529

2. dfs遍历

感觉dfs一般用于路径型问题求解,就是每个答案需要很多步完成,这种答案的个数是多少,就像是回溯遍历一样, 而深度优先则更倾向于快速到达某个位置的方法。

1. 递归写法

visited = set()

def dfs(node, visited):
    if node in visited: # terminator
    	# already visited
    	return

	visited.add(node)

	# process current node here.
	...
	for next_node in node.children():
		if next_node not in visited:
			dfs(next_node, visited)

2. 非递归写法

借助一个stack

def DFS(self, root):

	if tree.root is None:
		return []

	visited, stack = [], [root]

	while stack:
		node = stack.pop()
		visited.add(node)

		process (node)
        # 生成相关的节点
		nodes = generate_related_nodes(node)
		stack.push(nodes)

	# other processing work
	...

3. bfs代码模板

一般都是借用一个queue

# Python
def BFS(root):
	visited = set()
	queue = []
	queue.append([root])
	while queue:
		node = queue.pop()
		visited.add(node)
		process(node)
		nodes = generate_related_nodes(node)
		queue.push(nodes)

# other processing work

总结

1.基因变化

在写bfs,dfs的时候一定不能忘了visited的判断,刚开始因为忘了,导致了代码死循环了,因为你的问题可能是一个类似于图的问题

2. 岛屿数量

这个在广度优先遍历的时候处理不得当,应该在加入queue之前赋值为0的,这里其实等于是共用了visited数组,所以处理也要更加小心一些

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        row_num = len(grid)
        col_num =  len(grid[0])
        island = 0
        queue = []
        directions = [(0,-1),(0,1),(-1,0),(1,0)]
        for row in range(row_num) :
            for col in range(col_num) :
                if grid[row][col] == "0":
                    continue 
                island += 1
                grid[row][col] = "0"  # 一开始这里没有
                queue.append((row,col))
                while queue:
                    row_p,col_p = queue.pop(0)
                    # grid[row_p][col_p] = "0"    最开始是只是在这里进行了赋值,导致了后面处理的时候出现了反复应该,岛屿数量变少了或者会进入死循环
                    for direct in directions :
                        row_d=row_p + direct[0]
                        col_d =col_p+ direct[1]
                        if row_d >= 0 and col_d >= 0 and row_d < row_num and col_d < col_num:
                            if grid[row_d][col_d] == "1" :
                                queue.append((row_d,col_d))
                                grid[row_d][col_d] = "0" # 一开始这里也没有
        return island

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值