「每日LeetCode」2021年9月17日

本文最后更新于:2023年3月19日 晚上

Lt36. 有效的数独

36. 有效的数独

请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

image.png
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
注意:

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。

示例 1:
输入: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”]] 输出:true
示例 2:
输入:board = [[“8”,”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”]] 输出:false 解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例 1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

提示:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字或者 ‘.’

思路

按题意,先判断水平和竖直是否都符合,再逐个判断九个宫格是否都符合要求即可。

解答

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function (board) {
const vertical = (j) => {
let flag = true;
const set = new Set();
for (let i = 0; i < board.length; i++) {
const element = board[i][j];
if (element === ".") continue;
if (set.has(element)) return false;
set.add(element);
}
return flag;
};

const horizontal = (i) => {
let flag = true;
const set = new Set();
for (let j = 0; j < board[i].length; j++) {
const element = board[i][j];
if (element === ".") continue;
if (set.has(element)) return false;
set.add(element);
}
return flag;
};

const checkGrid = (i, j) => {
let flag = true;
let offsetX = i * 3,
offsetY = j * 3;
const set = new Set();
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
const element = board[i + offsetX][j + offsetY];
if (element === ".") continue;
if (set.has(element)) return false;
set.add(element);
}
}
return flag;
};

const check = (i) => {
return vertical(i) && horizontal(i);
};

for (let i = 0; i < board.length; i++) {
if (!check(i)) return false;
}
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (!checkGrid(i, j)) return false;
}
}
return true;
};