初级算法-数组章节-有效的数组

303 阅读3分钟

初级算法(第十题)

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

请你判断一个 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 存在, 因此这个数独是无效的。

解题思路

  1. 首先题目要求同行不能有重复同列不能有重复,每一个9宫格不能有重复

  2. 那么我们首先想到怎么来判断同行同列同一个九宫格

  3. 我们可以为行,列,九宫格分别定义一个容器,就用row={},col={},box={}

  4. 我们就可以去循环遍历二位数组了,然后判断是否不等于'.'不等于'.'就判断容器中这个数值为key是否存在。如果不存在就将它和对应容器的的属性拼接放入容器赋值为true

  5. 比较难理解的就是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+00*3+10*3+2,那么第二组就应该是乘以三1*3+0=31*3+1=41*3+2=5。因为是数组所以盒子坐标也是0代表1,1代表第二个盒子这样。最后盒子的分布应该是下面这样的

012
345
678

话不多说上代码

/**
 * @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;
};

每天进步一点,理想终将实现。

祝大家前程似锦