📑 题目:36. 有效的数独

🚀 本题 LeetCode 传送门

题目大意

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

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

解题思路

  • 给出一个数独的棋盘,要求判断这个棋盘当前是否满足数独的要求:即行列是否都只包含 1-9,每个九宫格里面是否也只包含 1-9 。
  • 注意这题和第 37 题是不同的,这一题是判断当前棋盘状态是否满足数独的要求,而第 37 题是要求求解数独。本题中的棋盘有些是无解的,但是棋盘状态是满足题意的。

代码

  1. package leetcode
  2. import "strconv"
  3. // 解法一 暴力遍历,时间复杂度 O(n^3)
  4. func isValidSudoku(board [][]byte) bool {
  5. // 判断行 row
  6. for i := 0; i < 9; i++ {
  7. tmp := [10]int{}
  8. for j := 0; j < 9; j++ {
  9. cellVal := board[i][j : j+1]
  10. if string(cellVal) != "." {
  11. index, _ := strconv.Atoi(string(cellVal))
  12. if index > 9 || index < 1 {
  13. return false
  14. }
  15. if tmp[index] == 1 {
  16. return false
  17. }
  18. tmp[index] = 1
  19. }
  20. }
  21. }
  22. // 判断列 column
  23. for i := 0; i < 9; i++ {
  24. tmp := [10]int{}
  25. for j := 0; j < 9; j++ {
  26. cellVal := board[j][i]
  27. if string(cellVal) != "." {
  28. index, _ := strconv.Atoi(string(cellVal))
  29. if index > 9 || index < 1 {
  30. return false
  31. }
  32. if tmp[index] == 1 {
  33. return false
  34. }
  35. tmp[index] = 1
  36. }
  37. }
  38. }
  39. // 判断 9宫格 3X3 cell
  40. for i := 0; i < 3; i++ {
  41. for j := 0; j < 3; j++ {
  42. tmp := [10]int{}
  43. for ii := i * 3; ii < i*3+3; ii++ {
  44. for jj := j * 3; jj < j*3+3; jj++ {
  45. cellVal := board[ii][jj]
  46. if string(cellVal) != "." {
  47. index, _ := strconv.Atoi(string(cellVal))
  48. if tmp[index] == 1 {
  49. return false
  50. }
  51. tmp[index] = 1
  52. }
  53. }
  54. }
  55. }
  56. }
  57. return true
  58. }
  59. // 解法二 添加缓存,时间复杂度 O(n^2)
  60. func isValidSudoku1(board [][]byte) bool {
  61. rowbuf, colbuf, boxbuf := make([][]bool, 9), make([][]bool, 9), make([][]bool, 9)
  62. for i := 0; i < 9; i++ {
  63. rowbuf[i] = make([]bool, 9)
  64. colbuf[i] = make([]bool, 9)
  65. boxbuf[i] = make([]bool, 9)
  66. }
  67. // 遍历一次,添加缓存
  68. for r := 0; r < 9; r++ {
  69. for c := 0; c < 9; c++ {
  70. if board[r][c] != '.' {
  71. num := board[r][c] - '0' - byte(1)
  72. if rowbuf[r][num] || colbuf[c][num] || boxbuf[r/3*3+c/3][num] {
  73. return false
  74. }
  75. rowbuf[r][num] = true
  76. colbuf[c][num] = true
  77. boxbuf[r/3*3+c/3][num] = true // r,c 转换到box方格中
  78. }
  79. }
  80. }
  81. return true
  82. }