2021-09-22:请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)数独部分空格内已填入了数字,空白格用 '.' 表示。注意:一个有效的数独(部分已被填充)不一定是可解的。只需要根据以上规则,验证已经填入的数字是否有效即可。

福大大 答案2021-09-22:

同行同列同宫。重复出现,返回false;否则返回true。
时间复杂度:O(1)。
空间复杂度:O(1)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    board := [][]byte{
        {'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'},
    }
    ret := isValidSudoku(board)
    fmt.Println(ret)

}

func isValidSudoku(board [][]byte) bool {
    row := make([][]bool, 9)
    for i := 0; i < 9; i++ {
        row[i] = make([]bool, 10)
    }
    col := make([][]bool, 9)
    for i := 0; i < 9; i++ {
        col[i] = make([]bool, 10)
    }
    bucket := make([][]bool, 9)
    for i := 0; i < 9; i++ {
        bucket[i] = make([]bool, 10)
    }
    for i := 0; i < 9; i++ {
        for j := 0; j < 9; j++ {
            bid := 3*(i/3) + (j / 3)
            if board[i][j] != '.' {
                num := board[i][j] - '0'
                if row[i][num] || col[j][num] || bucket[bid][num] {
                    return false
                }
                row[i][num] = true
                col[j][num] = true
                bucket[bid][num] = true
            }
        }
    }
    return true
}

执行结果如下:
图片


左神java代码