LeetCode 752. 打开转盘锁 — BFS 解法详解
题目描述
LeetCode 第752题 打开转盘锁 主要考察的是广度优先搜索(BFS)算法在图遍历中的应用。题目给定一个由四个圆形拨轮组成的转盘锁,每个拨轮上有 10 个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'。每次可以通过旋转一个拨轮将当前数字加一或减一,旋转后它会变成一个新的数字。当所有四个拨轮的数字组合起来时,形成一个四位数字的字符串。初始时,转盘锁的数字为 '0000'
,目标是解锁并找到最小的旋转次数。
同时,题目还给定了一个死亡数字列表,如果转盘锁上的数字与死亡列表中的任何一个数字相同,锁将会被永久锁定。要求我们计算从初始状态 '0000'
到目标数字 target
的最小旋转次数。如果无法解锁,返回 -1
。
输入:
- 一个字符串数组
deadends
,其中包含了一组死亡数字。 - 一个字符串
target
,表示目标数字。
输出:
- 返回解锁目标所需的最小步数,若无法解锁返回
-1
。
解题分析
这是一个经典的图论问题,可以通过广度优先搜索(BFS)来解决。BFS 算法可以在最短的步数内找到从起始点到目标点的路径,且可以有效避免死循环。由于每个拨轮有 10 个数字,所以每个状态都可以转换成最多 8 个新的状态(每个拨轮加1或减1)。因此,我们可以将这个问题视为图的遍历问题,从 '0000'
开始,层层推进,通过 BFS 扩展到目标状态。
关键点:
- 状态空间:状态由四个拨轮组成,每个拨轮的数字是
0-9