题目描述
思路解析动画文字版
下面 9 步动画会按主解代码推进,而不是泛泛讲题型。
1. 看输入:图/Trie 状态跟着代码走:先把示例输入映射到代码参数:def minMutation(self, startGene, endGene, bank):。
2. 初始化:图/Trie 状态跟着代码走:开局只立住必要变量:bank = set(bank);q = deque([(startGene, 0)]);seen = {startGene}。
3. 进入主循环:图/Trie 状态跟着代码走:主流程从这里开始:while q:。
4. 判断分支:图/Trie 状态跟着代码走:题目条件落到这一行:if cur == endGene:。
5. 更新状态:图/Trie 状态跟着代码走:对应代码:seen.add(nxt)。这一行决定当前轮对答案有什么贡献。
6. 处理边界:图/Trie 状态跟着代码走:边界跟着代码看:q.append((nxt, step + 1))。
7. 继续推进:图/Trie 状态跟着代码走:推进语句是:cur, step = q.popleft()。处理过的部分不再重新枚举。
8. 准备返回:图/Trie 状态跟着代码走:到这里,q 已经能表达题目要求。
9. 答案收束:图/Trie 状态跟着代码走:最后检查返回形态:返回值、原地修改或设计类状态,要和 LeetCode 判题方式一致。
记住这题的代码骨架:题意约束先落到状态变量,再用循环或递归维护它。
参考代码
from collections import dequeclass 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),队列和访问集合
易错点
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。再去主线里挑下一道练手。
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题