应用队列解决最短路径相关问题
1、 完全平方数(279)
题目描述:
【中等题】
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
题目链接
思路分析:
class Solution:
def numSquares(self, n: int) -> int:
queue=[]
visited=[False]*(n+1)
queue.insert(0,(n,0))
visited[n]= True
while queue:
num=queue.pop()
i=1
while True:
a=num[0]-i*i
if a<0:
break
if a==0:
return num[1]+1
# 如果已经访问过,就不再加入队列了,这样保证不会绕远
if not visited[a]:
queue.insert(0,(a,num[1]+1))
visited[a]=True
i+=1
2、 单词接龙(127)
题目描述:
【中等题】
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:
每次转换只能改变一个字母。
转换过程中的中间单词必须是字典中的单词。
说明:
- 如果不存在这样的转换序列,返回 0。
- 所有单词具有相同的长度。
- 所有单词只由小写字母组成。
- 字典中不存在重复的单词。
- 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。
题目链接
思路分析:
3、 单词接龙II(126)
题目描述:
【困难题】
给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:
1、每次转换只能改变一个字母。
2、转换后得到的单词必须是字典中的单词。
说明:
- 如果不存在这样的转换序列,返回一个空列表。
- 所有单词具有相同的长度。
- 所有单词只由小写字母组成。
- 字典中不存在重复的单词。
- 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。
题目链接
思路分析: