有效的数独

312 阅读2分钟

这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

leetcode 有效的数独

请你判断一个 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

解题:要判断9 x 9 的数独是否有效,可以遍历每一个数字来判断了,同时有效的数独还得满足几个条件:1.数字1-9中在每一列不能出现相同的数字,2.数字1-9中在每一行不能出现相同的数字,3.在9 x 9分割成的每一个3 x 3的区域内也不能出现数字1-9中相同的数字。所以就是通过这些条件来校验是否满足有效数独。

所以在遍历的过程中可以使用哈希表来记录一下,每一行、每一列、每一个九宫格中数字出现的次数,哈希表的元素下标数字就代表这个数字出现的次数,因为这个下标是从0开始的所以,下标要+1或者数字-1来判断,或者也可以不用0下标的位置,元素值就代表这个数字下标+1出现的次数了,但凡有一个数字重复那就over。遍历获取字符数字,如果不是数字的话就不用管了,否则就把这个数字对应出现的次数+1,一边遍历的的同时一边判断,如果有数字在这些区域内重复出现了就直接返回false; 具体的,用两个9 x 9 的数组存储每一行、每一列的数字,一个3 x 3 x 9的数组存储每一个九宫格的数字,遍历9 x 9的数独的数字,然后给每一个哈希表的下标下的数字次数+1,最后判断一下这个数字是不是重复出现了,重复了就直接结束,否则继续判断知道完毕就代表没问题了。

class Solution {
    public boolean isValidSudoku(char[][] board) {
        // 行、列、格的哈希表
        int[][] row = new int[9][9];
        int[][] column = new int[9][9];
        int[][][] cell = new int[3][3][9];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                // 遍历获取數字
                char c = board[i][j];
                if (c == '.') {
                    continue;
                }
                int num = c - '0' - 1;
                row[i][num]++;
                column[j][num]++;
                cell[i / 3][j / 3][num]++;
                if (row[i][num] > 1 || column[j][num] > 1 || cell[i / 3][j / 3][num] > 1) {
                    return false;
                }
            }
        }
        return true;
    }
}