# 36. 有效的数独
# 题目
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
数独部分空格内已填入了数字,空白格用 '.' 表示。
说明:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 给定数独序列只包含数字 1-9 和字符 '.' 。
- 给定数独永远是 9x9 形式的。
# 题解
# 一次迭代
子数独的索引 index = (row/3)*3 + columns/3
/**
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function(board) {
// 三个方向判重
let rows = {};
let columns = {};
let boxes = {};
// 遍历数独
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
let num = board[i][j];
if (num != ".") {
// 子数独序号
let boxIndex = parseInt(i / 3) * 3 + parseInt(j / 3);
if (
rows[i + "-" + num] ||
columns[j + "-" + num] ||
boxes[boxIndex + "-" + num]
) {
return false;
}
// 以各自方向 + 不能出现重复的数字 组成唯一键值,若出现第二次,即为重复
rows[i + "-" + num] = true;
columns[j + "-" + num] = true;
boxes[boxIndex + "-" + num] = true;
}
}
}
return true;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32