36. Valid Sudoku

Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

Each row must contain the digits 1-9 without repetition. Each column must contain the digits 1-9 without repetition. Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition. The Sudoku board could be partially filled, where empty cells are filled with the character '.'.

Example 1:

Input:
[
  ["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"]
]
Output: true

Example 2:

Input:
[
  ["8","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"]
]
Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being 
    modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.

Note:

  • A Sudoku board (partially filled) could be valid but is not necessarily solvable.
  • Only the filled cells need to be validated according to the mentioned rules.
  • The given board contain only digits 1-9 and the character '.'.
  • The given board size is always 9x9.

hash map

/**
 * @param {character[][]} board
 * @return {boolean}
 */
var isValidSudoku = function(board) {
  var m = new Map()
  for (let i = 0; i < 9; i++) {
    for (let j = 0; j < 9; j++) {
      var cur = board[i][j]
      if (cur!=='.' && duplicate(m, cur, i, j)) return false
    }
  }
  return true
};

var duplicate = function(m, cur, i, j) {
  const [row, col, box] = [cur+'r'+i, cur+'c'+j, cur+'b'+Math.floor(i/3)+Math.floor(j/3)]
  if (m.has(row) || m.has(col) || m.has(box)) return true
  m.set(row, cur)
  m.set(col, cur)
  m.set(box, cur)
};

my own

var isValidSudoku = function(board) {
  let set = new Set()
  let size = 9
  // boxes
  let x = 0
  let y = 0
  for (let i = 0; i < size; i++) {
    // check row
    for (let j = 0; j < size; j++) {
      const cur = board[i][j]
      if (cur !== '.') {
        if (set.has(cur)) return false
        set.add(cur)
      }
    }
    set.clear()
    // col
    for (let j = 0; j < size; j++) {
      const cur = board[j][i]
      if (cur !== '.') {
        if (set.has(cur)) return false
        set.add(cur)
      }
    }
    set.clear()
    // box
    x = i%3*3
    y = Math.floor(i/3)*3
    for (let j = x; j < x + 3; j++) {
      for (let k = y; k < y + 3; k++) {
        const cur = board[j][k]
        if (cur !== '.') {
          if (set.has(cur)) return false
          set.add(cur)
        }
      }
    }
    set.clear()
  }
  return true
};

python original

class Solution:
  def isValidSudoku(board):
    """
    :type board: List[List[str]]
    :rtype: bool
    """
    seen = []
    for i, row in enumerate(board):
      for j, digit in enumerate(row):
        if digit != '.':
          seen.append((i, digit))
          seen.append((digit, j))
          seen.append((i // 3, j // 3, digit))
    return len(seen) == len(set(seen))

results matching ""

    No results matching ""