# 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