|
5 | 5 |
|
6 | 6 | ## 题目大意 |
7 | 7 |
|
8 | | -给定一个二维的字符数组 `board` 用来表示数独,其中数字 `1-9` 表示该位置已经填入了数字,`.` 表示该位置还没有填入数字。 |
| 8 | +**描述**:给定一个二维的字符数组 $board$ 用来表示数独,其中数字 $1 \sim 9$ 表示该位置已经填入了数字,`.` 表示该位置还没有填入数字。 |
9 | 9 |
|
10 | | -现在编写一个程序,通过填充空格的方式来解决数独问题,最终不用返回答案,将题目给定 `board` 修改为可行的方案即可。 |
| 10 | +**要求**:现在编写一个程序,通过填充空格的方式来解决数独问题,最终不用返回答案,将题目给定 $board$ 修改为可行的方案即可。 |
11 | 11 |
|
12 | | -数独解法需遵循如下规则: |
| 12 | +**说明**: |
13 | 13 |
|
14 | | -- 数字 `1-9` 在每一行只能出现一次。 |
15 | | -- 数字 `1-9` 在每一列只能出现一次。 |
16 | | -- 数字 `1-9` 在每一个以粗直线分隔的 `3 * 3` 宫格内只能出现一次。 |
| 14 | +- 数独解法需遵循如下规则: |
| 15 | + |
| 16 | + - 数字 $1 \sim 9$ 在每一行只能出现一次。 |
| 17 | + - 数字 $1 \sim 9$ 在每一列只能出现一次。 |
| 18 | + - 数字 $1 \sim 9$ 在每一个以粗直线分隔的 $3 \times 3$ 宫格内只能出现一次。 |
| 19 | +- $board.length == 9$。 |
| 20 | +- $board[i].length == 9$。 |
| 21 | +- $board[i][j]$ 是一位数字或者 `.`。 |
| 22 | +- 题目数据保证输入数独仅有一个解。 |
| 23 | + |
| 24 | +**示例**: |
| 25 | + |
| 26 | +- 示例 1: |
| 27 | + |
| 28 | + |
| 29 | + |
| 30 | +```python |
| 31 | +输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]] |
| 32 | +输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]] |
| 33 | +解释:输入的数独如上图所示,唯一有效的解决方案如下所示: |
| 34 | +``` |
17 | 35 |
|
18 | 36 |  |
19 | 37 |
|
20 | 38 | ## 解题思路 |
21 | 39 |
|
22 | | -使用回溯算法求解。对于每一行、每一列、每一个数字,都需要 1 重 for 循环来遍历,这样就是 3 重 for 循环。 |
23 | | - |
24 | | -对于第 i 行、第 j 列的元素来说,如果当前位置为空位,则尝试将第 k 个数字置于此处,并检验数独的有效性。如果有效,则继续遍历下一个空位,直到遍历完所有空位,得到可行方案或者遍历失败时结束。 |
| 40 | +### 思路 1:回溯算法 |
25 | 41 |
|
26 | | -遍历完下一个空位之后再将此位置进行回退,置为 `.`。 |
| 42 | +对于每一行、每一列、每一个数字,都需要一重 `for` 循环来遍历,这样就是三重 `for` 循环。 |
27 | 43 |
|
| 44 | +对于第 $i$ 行、第 $j$ 列的元素来说,如果当前位置为空位,则尝试将第 $k$ 个数字置于此处,并检验数独的有效性。如果有效,则继续遍历下一个空位,直到遍历完所有空位,得到可行方案或者遍历失败时结束。 |
28 | 45 |
|
| 46 | +遍历完下一个空位之后再将此位置进行回退,置为 `.`。 |
29 | 47 |
|
30 | | -## 代码 |
| 48 | +### 思路 1:代码 |
31 | 49 |
|
32 | 50 | ```python |
33 | 51 | class Solution: |
@@ -70,3 +88,8 @@ class Solution: |
70 | 88 | """ |
71 | 89 | ``` |
72 | 90 |
|
| 91 | +### 思路 1:复杂度分析 |
| 92 | + |
| 93 | +- **时间复杂度**:$O(9^m)$,$m$ 为棋盘中 `.` 的数量。 |
| 94 | +- **空间复杂度**:$O(9^2)$。 |
| 95 | + |
0 commit comments