|
5 | 5 |
|
6 | 6 | ## 题目大意
|
7 | 7 |
|
8 |
| -有一把带有四个数字的密码锁,每个位置上有 `0` ~ `9` 共 `10` 个数字。每次只能将其中一个位置上的数字转动一下。可以向上转,也可以向下转。比如:`1 -> 2`、`2 -> 1`。 |
| 8 | +**描述**:有一把带有四个数字的密码锁,每个位置上有 `0` ~ `9` 共 `10` 个数字。每次只能将其中一个位置上的数字转动一下。可以向上转,也可以向下转。比如:`1 -> 2`、`2 -> 1`。 |
9 | 9 |
|
10 | 10 | 密码锁的初始数字为:`0000`。现在给定一组表示死亡数字的字符串数组 `deadends`,和一个带有四位数字的目标字符串 `target`。
|
11 | 11 |
|
12 | 12 | 如果密码锁转动到 `deadends` 中任一字符串状态,则锁就会永久锁定,无法再次旋转。
|
13 | 13 |
|
14 |
| -要求:给出最小的选择次数,使得锁的状态由 `0000` 转动到 `target`。 |
| 14 | +**要求**:给出使得锁的状态由 `0000` 转动到 `target` 的最小的选择次数。如果无论如何不能解锁,返回 `-1` 。 |
15 | 15 |
|
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 | +``` |
17 | 38 |
|
18 |
| -使用广度优先搜索遍历,将`0000` 状态入队。 |
| 39 | +## 解题思路 |
19 | 40 |
|
20 |
| -- 将队列中的元素出队,判断是否为死亡字符串 |
21 |
| -- 如果为死亡字符串,则跳过该状态,否则继续执行。 |
| 41 | +### 思路 1:广度优先搜索 |
22 | 42 |
|
23 |
| -- 如果为目标字符串,则返回当前路径长度,否则继续执行。 |
24 |
| -- 枚举当前状态所有位置所能到达的所有状态,并判断是否访问过该状态。 |
| 43 | +1. 定义 `visited` 为标记访问节点的 set 集合变量,`queue` 为存放节点的队列。 |
| 44 | +2. 将`0000` 状态标记为访问,并将其加入队列 `queue`。 |
| 45 | +3. 将当前队列中的所有状态依次出队,判断这些状态是否为死亡字符串。 |
| 46 | + 1. 如果为死亡字符串,则跳过该状态,否则继续执行。 |
| 47 | + 2. 如果为目标字符串,则返回当前路径长度,否则继续执行。 |
25 | 48 |
|
26 |
| -- 如果之前出现过该状态,则继续执行,否则将其存入队列,并标记访问。 |
| 49 | +4. 枚举当前状态所有位置所能到达的所有状态(通过向上或者向下旋转),并判断是否访问过该状态。 |
| 50 | +5. 如果之前出现过该状态,则继续执行,否则将其存入队列,并标记访问。 |
| 51 | +6. 遍历完步骤 3 中当前队列中的所有状态,令路径长度加 `1`,继续执行 3 ~ 5 步,直到队列为空。 |
| 52 | +7. 如果队列为空,也未能到达目标状态,则返回 `-1`。 |
27 | 53 |
|
28 |
| -## 代码 |
| 54 | +### 思路 1:代码 |
29 | 55 |
|
30 | 56 | ```Python
|
31 | 57 | import collections
|
@@ -73,3 +99,7 @@ class Solution:
|
73 | 99 | return "".join(s_list)
|
74 | 100 | ```
|
75 | 101 |
|
| 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