LeetCode 36 有效的数独

题目:

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

数字 1-9 在每一行只能出现一次。

数字 1-9 在每一列只能出现一次。

数字 1-9 在每一个以粗实线分隔的 3×3 宫内只能出现一次。(请参考示例图)

注意:

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。
  • 空白格用 ‘.’ 表示。

解题:

按给出来的方式验证就可以

代码:

func isValidSudoku(board [][]byte) bool {
    var tmp map[byte]byte
    for i := 0; i < 9; i++ {
        tmp = map[byte]byte{}
        for j := 0; j < 9; j++ {
            if board[i][j] == '.' {
                continue
            }
            if _, ok := tmp[board[i][j]]; ok {
                return false
            } else {
                tmp[board[i][j]] = board[i][j]
            }
        }
        tmp = map[byte]byte{}
        for j := 0; j < 9; j++ {
            if board[j][i] == '.' {
                continue
            }
            if _, ok := tmp[board[j][i]]; ok {
                return false
            } else {
                tmp[board[j][i]] = board[j][i]
            }
        }
    }
    for i := 0; i < 9; i += 3 {
        for j := 0; j < 9; j += 3 {
            tmp = map[byte]byte{}
            for k := 0; k < 3; k++ {
                for l := 0; l < 3; l++ {
                    if board[i+k][j+l] == '.' {
                        continue
                    }
                    if _, ok := tmp[board[i+k][j+l]]; ok {
                        return false
                    } else {
                        tmp[board[i+k][j+l]] = board[i+k][j+l]
                    }
                }
            }
        }
    }
    return true
}

官方解答: 

// 一次遍历
func isValidSudoku(board [][]byte) bool {
    var rows, columns [9][9]int
    var subboxes [3][3][9]int
    for i, row := range board {
        for j, c := range row {
            if c == '.' {
                continue
            }
            index := c - '1'
            rows[i][index]++
            columns[j][index]++
            subboxes[i/3][j/3][index]++
            if rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i/3][j/3][index] > 1 {
                return false
            }
        }
    }
    return true
}

自己写的效率有点低,数学是真的重要

One thought on “LeetCode 36 有效的数独

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注