Skip to content

Commit daecb5e

Browse files
committed
Update 0752. 打开转盘锁.md
1 parent b47495a commit daecb5e

File tree

1 file changed

+40
-10
lines changed

1 file changed

+40
-10
lines changed

Solutions/0752. 打开转盘锁.md

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,53 @@
55

66
## 题目大意
77

8-
有一把带有四个数字的密码锁,每个位置上有 `0` ~ `9``10` 个数字。每次只能将其中一个位置上的数字转动一下。可以向上转,也可以向下转。比如:`1 -> 2``2 -> 1`
8+
**描述**有一把带有四个数字的密码锁,每个位置上有 `0` ~ `9``10` 个数字。每次只能将其中一个位置上的数字转动一下。可以向上转,也可以向下转。比如:`1 -> 2``2 -> 1`
99

1010
密码锁的初始数字为:`0000`。现在给定一组表示死亡数字的字符串数组 `deadends`,和一个带有四位数字的目标字符串 `target`
1111

1212
如果密码锁转动到 `deadends` 中任一字符串状态,则锁就会永久锁定,无法再次旋转。
1313

14-
要求:给出最小的选择次数,使得锁的状态由 `0000` 转动到 `target`
14+
**要求**:给出使得锁的状态由 `0000` 转动到 `target` 的最小的选择次数。如果无论如何不能解锁,返回 `-1`
1515

16-
## 解题思路
16+
**说明**
17+
18+
- $1 \le deadends.length \le 500$
19+
$deadends[i].length == 4$
20+
$target.length == 4$
21+
$target$ 不在 $deadends$ 之中
22+
$target$ 和 $deadends[i]$ 仅由若干位数字组成。
23+
24+
**示例**
25+
26+
```Python
27+
输入:deadends = ["0201","0101","0102","1212","2002"], target = "0202"
28+
输出:6
29+
解释:
30+
可能的移动序列为 "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"
31+
注意 "0000" -> "0001" -> "0002" -> "0102" -> "0202" 这样的序列是不能解锁的,
32+
因为当拨动到 "0102" 时这个锁就会被锁定。
33+
34+
输入: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"
35+
输出:-1
36+
解释:无法旋转到目标数字且不被锁定。
37+
```
1738

18-
使用广度优先搜索遍历,将`0000` 状态入队。
39+
## 解题思路
1940

20-
- 将队列中的元素出队,判断是否为死亡字符串
21-
- 如果为死亡字符串,则跳过该状态,否则继续执行。
41+
### 思路 1:广度优先搜索
2242

23-
- 如果为目标字符串,则返回当前路径长度,否则继续执行。
24-
- 枚举当前状态所有位置所能到达的所有状态,并判断是否访问过该状态。
43+
1. 定义 `visited` 为标记访问节点的 set 集合变量,`queue` 为存放节点的队列。
44+
2.`0000` 状态标记为访问,并将其加入队列 `queue`
45+
3. 将当前队列中的所有状态依次出队,判断这些状态是否为死亡字符串。
46+
1. 如果为死亡字符串,则跳过该状态,否则继续执行。
47+
2. 如果为目标字符串,则返回当前路径长度,否则继续执行。
2548

26-
- 如果之前出现过该状态,则继续执行,否则将其存入队列,并标记访问。
49+
4. 枚举当前状态所有位置所能到达的所有状态(通过向上或者向下旋转),并判断是否访问过该状态。
50+
5. 如果之前出现过该状态,则继续执行,否则将其存入队列,并标记访问。
51+
6. 遍历完步骤 3 中当前队列中的所有状态,令路径长度加 `1`,继续执行 3 ~ 5 步,直到队列为空。
52+
7. 如果队列为空,也未能到达目标状态,则返回 `-1`
2753

28-
## 代码
54+
### 思路 1:代码
2955

3056
```Python
3157
import collections
@@ -73,3 +99,7 @@ class Solution:
7399
return "".join(s_list)
74100
```
75101

102+
### 思路 1:复杂度分析
103+
104+
- **时间复杂度**:$O(10^d \times d^2 + m \times d)$。其中 $d$ 是数字的位数,$m$ 是数组 $deadends$ 的长度。
105+
- **空间复杂度**:$O(10^D \times d + m)$。

0 commit comments

Comments
 (0)