返回
编程新手必备:用DFS和BFS破解LeetCode难题
前端
2023-10-09 03:27:48
作为一名初出茅庐的程序员,踏上算法学习的道路时,LeetCode无疑是必经的修行场。而DFS(深度优先搜索)和BFS(广度优先搜索)作为两大搜索算法,更可谓是LeetCode刷题中绕不开的坎儿。
深度优先搜索(DFS)
DFS的过程就像在一个迷宫中探索。它从一个节点开始,不断深入探索,直至走不通为止,再回溯到上一个节点继续探索。DFS的优点在于,可以深入探索每一条路径,更易于找到最优解。
广度优先搜索(BFS)
BFS的过程则更像是波浪式前进。它从一个节点开始,将该节点的所有相邻节点都纳入队列,再依次探索队列中的所有节点,直到队列为空为止。BFS的优点在于,可以更全面地搜索所有节点,不易错过任何解。
算法指南
现在,让我们通过具体的LeetCode题目来理解DFS和BFS的实际应用。
LeetCode 103:二叉树的锯齿形层序遍历
DFS实现:
def zigzagLevelOrder(root):
res = []
level = 0
dfs(root, level, res)
return res
def dfs(root, level, res):
if not root:
return
if level >= len(res):
res.append([])
if level % 2 == 0:
res[level].append(root.val)
else:
res[level].insert(0, root.val)
dfs(root.left, level + 1, res)
dfs(root.right, level + 1, res)
BFS实现:
def zigzagLevelOrder(root):
if not root:
return []
res = []
queue = [root]
level = 0
while queue:
size = len(queue)
level_res = []
for i in range(size):
node = queue.pop(0)
if level % 2 == 0:
level_res.append(node.val)
else:
level_res.insert(0, node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(level_res)
level += 1
return res
LeetCode 199:二叉树的右视图
DFS实现:
def rightSideView(root):
if not root:
return []
max_level = 0
res = []
dfs(root, 1, max_level, res)
return res
def dfs(root, level, max_level, res):
if not root:
return
if level > max_level:
res.append(root.val)
max_level = level
dfs(root.right, level + 1, max_level, res)
dfs(root.left, level + 1, max_level, res)
BFS实现:
def rightSideView(root):
if not root:
return []
res = []
queue = [root]
while queue:
size = len(queue)
last_val = None
for i in range(size):
node = queue.pop(0)
last_val = node.val
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(last_val)
return res
LeetCode 542:01 矩阵
BFS实现:
def updateMatrix(matrix):
if not matrix:
return []
m, n = len(matrix), len(matrix[0])
res = [[0] * n for _ in range(m)]
queue = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]
while queue:
i, j = queue.pop(0)
for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]:
x, y = i + dx, j + dy
if 0 <= x < m and 0 <= y < n and res[x][y] == 0:
res[x][y] = res[i][j] + 1
queue.append((x, y))
return res
结语
DFS和BFS算法作为两把算法利刃,在解决LeetCode难题时可谓游刃有余。理解它们背后的原理和应用场景,将大大提升你的算法技能和刷题效率。