从三道LeetCode题目掌握广度优先搜索(BFS)

作者:问答酱2024.02.18 04:29浏览量:5

简介:本文将通过三道经典的LeetCode题目,详细讲解如何应用广度优先搜索(BFS)算法解决问题。通过实际应用和示例,帮助读者深入理解BFS的原理和技巧,提高算法解决能力。

千帆应用开发平台“智能体Pro”全新上线 限时免费体验

面向慢思考场景,支持低代码配置的方式创建“智能体Pro”应用

立即体验

广度优先搜索(BFS)是一种常见的图遍历算法,它按照层次顺序搜索图中的节点。在LeetCode中,有许多问题可以通过BFS得到解决。本文将通过三道具有代表性的题目,深入探讨如何应用BFS算法。

第一题:无向图的最短路径(广度优先搜索)

题目描述:给定一个无向图,请编写一个函数,计算从起点到终点的最短路径。可以使用广度优先搜索(BFS)算法解决该问题。

解题思路:使用BFS算法可以轻松解决无向图的最短路径问题。首先,创建一个队列用于存储待处理的节点,并将起点入队。同时,创建一个集合用于存储已访问过的节点,以避免重复访问。然后,开始BFS循环,在每一轮循环中,出队一个节点并访问其所有未访问过的邻居节点,将邻居节点入队并标记为已访问。重复此过程直到终点被访问到或队列为空。

示例代码(Python):

  1. from collections import deque
  2. def bfs(graph, start, end):
  3. queue = deque([start])
  4. visited = set([start])
  5. while queue:
  6. vertex = queue.popleft()
  7. if vertex == end:
  8. return True
  9. for neighbor in graph[vertex]:
  10. if neighbor not in visited:
  11. visited.add(neighbor)
  12. queue.append(neighbor)
  13. return False

注意事项:在实现BFS时,需要注意队列和集合的数据结构选择。队列用于按顺序存储待处理的节点,而集合则用于快速判断节点是否已被访问过。同时,要确保图中不存在环路,否则BFS无法正确计算最短路径。

第二题:丑数II(广度优先搜索)

题目描述:给定一个正整数n,返回长度为n的连续正整数序列中所有丑数之和。丑数定义为不是完全平方数的正整数。可以使用广度优先搜索(BFS)算法来解决问题。

解题思路:为了解决这个问题,我们可以使用BFS来生成长度为n的连续正整数序列,并检查每个数是否为丑数。丑数不是完全平方数,因此我们可以使用一个简单的数学性质来判断一个数是否为丑数:如果一个数k不是完全平方数,那么一定存在一个数i满足1 <= i <= k-1且k mod i == 0且i <= sqrt(k)。利用这个性质,我们可以从1开始逐个生成连续正整数序列,并使用BFS检查每个数是否为丑数。最后返回所有丑数的和即可。

示例代码(Python):

  1. from collections import deque
  2. from math import sqrt
  3. def ugly_numbers(n):
  4. ugly_sum = 0
  5. queue = deque([1]) # 起始值为1的队列
  6. visited = set([1]) # 记录已访问的数
  7. while len(queue) < n: # 队列长度小于n时继续循环
  8. num = queue.popleft() # 出队一个数
  9. ugly_sum += num # 累加到丑数和中
  10. for i in range(1, int(sqrt(num)) + 1): # 遍历可能的因子i
  11. if num % i == 0 and num // i != num // i.real: # 判断是否为丑数因子
  12. visited.add(num // i) # 将丑数因子入队并标记为已访问
  13. queue.append(num // i) # 将丑数因子入队等待后续判断和处理
  14. return ugly_sum # 返回丑数之和

注意事项:在实现BFS时,需要注意队列和集合的数据结构选择。队列用于按顺序存储待处理的数,而集合则用于快速判断数是否已被访问过。同时,要确保生成的连续正整数序列中不存在重复的数。另外,为了避免重复计算和存储过大的数,可以使用集合来记录已访问过的数。在判断一个数是否为丑数时,可以利用数学性质来优化判断过程。

第三题:单词接龙(广度优先搜索)

题目描述:给定两个字符串words1和words2,请你从

article bottom image

相关文章推荐

发表评论