LeetCode 433中等图搜索
最小基因变化 图解题解
这道题到底在问什么
给你两个基因序列 start 和 end ,以及一个基因库 bank ,请你找出并返回能够使 start 变化为 end 所需的最少变化次数。如果无法完成此基因变化,返回 -1 。 注意:起始基因序列 start 默认是有效的,但是它并不一定会出现在基因库中。
- start,end,bank
- "AACCGGTT","AACCGGTA",["AACCGGTA"]
- 输出
- 1
先想最直接的笨办法
图/Trie 状态跟着代码走:推进语句是:cur, step = q.popleft()。处理过的部分不再重新枚举。(动画第 10 步)
最优解:一步一步想明白
- 3下面 9 步动画会按主解代码推进,而不是泛泛讲题型。
- 4先读清 最小基因变化 的输入输出图/Trie 状态跟着代码走:先把示例输入映射到代码参数:def minMutation(self, startGene, endGene, bank):。
- 5bank = set(bank);q = deque([(startGene, 0)]);seen = {startGene}图/Trie 状态跟着代码走:开局只立住必要变量:bank = set(bank);q = deque([(startGene, 0)]);seen = {startGene}。
- 6while q:图/Trie 状态跟着代码走:主流程从这里开始:while q:。
- 7if cur == endGene:图/Trie 状态跟着代码走:题目条件落到这一行:if cur == endGene:。
- 8seen.add(nxt)图/Trie 状态跟着代码走:对应代码:seen.add(nxt)。这一行决定当前轮对答案有什么贡献。
- 9直接返回 -1图/Trie 状态跟着代码走:边界跟着代码看:q.append((nxt, step + 1))。
- 10cur, step = q.popleft()图/Trie 状态跟着代码走:推进语句是:cur, step = q.popleft()。处理过的部分不再重新枚举。
- 11return -1图/Trie 状态跟着代码走:到这里,q 已经能表达题目要求。
- 12return:return -1图/Trie 状态跟着代码走:最后检查返回形态:返回值、原地修改或设计类状态,要和 LeetCode 判题方式一致。
- 15记住这题的代码骨架:题意约束先落到状态变量,再用循环或递归维护它。
⚠️ 容易写错的地方
✗ 错:end 不在 bank 仍搜索
✓ 对:直接返回 -1
每次变化后必须在 bank 中
✗ 错:DFS 找最短
✓ 对:BFS
无权图最短路用 BFS
完整代码(Python)
Python
from collections import deque
class Solution:
def minMutation(self, startGene, endGene, bank):
bank = set(bank)
if endGene not in bank:
return -1
q = deque([(startGene, 0)])
seen = {startGene}
genes = 'ACGT'
while q:
cur, step = q.popleft()
if cur == endGene:
return step
arr = list(cur)
for i, old in enumerate(arr):
for ch in genes:
if ch == old:
continue
arr[i] = ch
nxt = ''.join(arr)
if nxt in bank and nxt not in seen:
seen.add(nxt)
q.append((nxt, step + 1))
arr[i] = old
return -1复杂度
时间复杂度
O(B*8*4)
B 为 bank 大小
空间复杂度
O(B)
队列和访问集合
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 最小基因变化 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
这道题为什么用「图搜索」,换最直接的暴力解会差在哪?+
图搜索抓住了本题的结构特征,把暴力解里重复的工作省掉;暴力解通常要多嵌套一层枚举,数据一大就超时。具体对比见上文「暴力解及其卡点」与「最优解逐步推演」两节。
时间复杂度为什么是 undefined?怎么推出来的?+
按上文复杂度小节的推导,时间复杂度为 undefined。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。