题目描述

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

1.数字 1-9 在每一行只能出现一次。
2.数字 1-9 在每一列只能出现一次。
3.数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

上图是一个部分填充的有效的数独。

数独部分空格内已填入了数字,空白格用 '.' 表示。

示例 1:

输入:
[
  ["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

思路

1.本题可以通过三个哈希表来记录每个元素出现的次数,若该元素在同一行、列或者33矩阵中出现多次,则不是有效数独。
2.3
3矩阵我们可以根据行列计算,弄出0-8个编号的矩阵即可。
类似于下图:

矩阵划分

Java代码实现

public boolean isValidSudoku(char[][] board) {
        Map<Character,Integer>[] rows = new HashMap[9];
        Map<Character,Integer>[] cols = new HashMap[9];
        Map<Character,Integer>[] boxes = new HashMap[9];

        //初始化
        for (int i = 0; i < 9; i++) {
            rows[i] = new HashMap<>();
            cols[i] = new HashMap<>();
            boxes[i] = new HashMap<>();
        }

        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if(board[i][j] == '.')
                    continue;
                //判断 行 是否符合要求
                if (rows[i].containsKey(board[i][j]))
                    return false;
                else
                    rows[i].put(board[i][j],i);
                //判断 列 是否符合要求
                if(cols[j].containsKey(board[i][j]))
                    return false;
                else 
                    cols[j].put(board[i][j],j);
                //判断 矩阵 是否符合要求
                int boxIndex = i/3 + j/3*3;
                if(boxes[boxIndex].containsKey(board[i][j]))
                    return false;
                else
                    boxes[boxIndex].put(board[i][j],boxIndex);
            }
        }
        return true; 
    }

Golang代码实现

func isValidSudoku(board [][]byte) bool {
    colMap := make([]map[byte]int,9)
    rowMap := make([]map[byte]int,9)
    boxMap := make([]map[byte]int,9)

    for i:=0 ;i < 9 ;i++{
        colMap[i] = make(map[byte]int,9)
        rowMap[i] = make(map[byte]int,9)
        boxMap[i] = make(map[byte]int,9)
    }

    for i := 0; i < 9; i++ {
        for j := 0; j < 9; j++ {
            if board[i][j] == '.'{
                continue
            }

            if val := rowMap[i][board[i][j]]; val == 1{
                return false
            }
            rowMap[i][board[i][j]] = 1

            if val := colMap[j][board[i][j]]; val == 1{
                return false
            }
            colMap[j][board[i][j]] = 1

            boxIndex := i/3 + j/3*3
            if val := boxMap[boxIndex][board[i][j]]; val == 1{
                return false
            }
            boxMap[boxIndex][board[i][j]] = 1
        }
    }
    return true
}