难度中等745收藏分享切换为英文接收动态反馈
请你判断一个 9 x 9
的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。(请参考示例图)
注意:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 空白格用
'.'
表示。
示例 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 存在, 因此这个数独是无效的。
题解
- 笨方法,分别判断
/**
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function(board) {
let rows = new Map(); // 行
let cols = new Map(); // 列
let boxs = new Map();
// 判断行
for(let i = 0; i < 9; i++) {
for(let j = 0; j < 9; j++) {
let tmp = board[i][j];
if(tmp == '.') continue;
if(rows.get(tmp) == 1) return false;
rows.set(tmp, 1);
}
rows.clear();
}
//判断列
for(let i = 0; i < 9; i++) {
for(let j = 0; j < 9; j++) {
let tmp = board[j][i];
if(tmp == '.') continue;
if(cols.get(tmp) == 1) return false;
cols.set(tmp, 1);
}
cols.clear();
}
// 判断九宫格
for(let i = 0; i < 3; i++) { // 行
for(let j = 0; j < 3; j++) { // 列
for(let k = 0; k < 3; k++) { // 行
for(let s = 0; s < 3; s++) { // 列
let tmp = board[k + 3*i][s + 3*j];
if(tmp == '.') continue;
if(boxs.get(tmp) == 1) return false;
boxs.set(tmp, 1);
}
}
boxs.clear();
}
}
return true;
};
- 压缩一下代码
/**
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function(board) {
let rows = new Map(); // 行
let cols = new Map(); // 列
let boxs = new Map(); // 九宫格
for(let i = 0; i < 9; i++) {
for(let j = 0; j < 9; j++) {
let tmp1 = board[i][j];
let tmp2 = board[j][i];
if(tmp1 != '.') { // 行
if(rows.get(tmp1) == 1) return false;
rows.set(tmp1, 1);
}
if(tmp2 != '.') { // 列
if(cols.get(tmp2) == 1) return false;
cols.set(tmp2, 1);
}
if(i < 3 && j < 3) { // 九宫格
for(let k = 0; k < 3; k++) { // 行
for(let s = 0; s < 3; s++) { // 列
let tmp = board[k + 3*i][s + 3*j];
if(tmp == '.') continue;
if(boxs.get(tmp) == 1) return false;
boxs.set(tmp, 1);
}
}
boxs.clear();
}
}
rows.clear();
cols.clear();
}
return true;
};