初级算法(第十题)
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 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 存在, 因此这个数独是无效的。
解题思路
-
首先题目要求
同行不能有重复,同列不能有重复,每一个9宫格不能有重复 -
那么我们首先想到怎么来
判断同行,同列和同一个九宫格呢 -
我们可以为
行,列,九宫格分别定义一个容器,就用row={},col={},box={} -
我们就可以去循环遍历二位数组了,然后判断是否不等于
'.'不等于'.'就判断容器中这个数值为key是否存在。如果不存在就将它和对应容器的的属性拼接放入容器赋值为true -
比较难理解的就是boxIndex推导过程,我们想知道9宫格每一个格子里面是否有重复的我们得知道是哪个盒子,所以就要将这几个盒子弄出来。我们是一个
二维数组我们只需找到当前数字属于第几个盒子就好了。那么我们怎么判断第几个盒子呢。首先我们又9行,9列这样的话就是每三行里面的每三列就是一个盒子。boxIndex = Math.floor(i/3)*3+Math.floor(j/3)。Math.floor(i/3)就是每三行一组。Math.floor(j/3)就是每三列一组他们相加就是盒子的序号。Math.floor(i/3)*3为什么要✖️3呢因为第二组的时候我们的盒子就是从第四个盒子开始的了,因为第一组一直都是0*3+0,0*3+1,0*3+2,那么第二组就应该是乘以三1*3+0=3,1*3+1=4,1*3+2=5。因为是数组所以盒子坐标也是0代表1,1代表第二个盒子这样。最后盒子的分布应该是下面这样的
| 0 | 1 | 2 |
| 3 | 4 | 5 |
| 6 | 7 | 8 |
话不多说上代码
/**
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function(board) {
let row = {};
let col = {};
let box = {};
for(let i = 0; i<board.length; i++){
for(let j = 0; j<board[i].length; j++){
let num = board[i][j];
let boxIndex = Math.floor(i/3)*3+Math.floor(j/3);
if(num !=='.'){
if(row[i+''+num] || col[j+''+num] || box[boxIndex+''+num]){
return false;
};
row[i+''+num] = true;
col[j+''+num] = true;
box[boxIndex+''+num] = true;
}
}
}
return true;
};