36. Valid Sudoku

  • Difficulty: Medium

  • Topics: Hash Table

  • Similar Questions:

Problem:

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

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.


A partially filled sudoku which is valid.

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.

Solutions:

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int m = board.size();
        if (m == 0) return true;
        for (int i = 0; i < m; ++i) {
            if (!isRowValid(board, i))  return false;
            if (!isColumnValid(board, i))   return false;
        }

        for (int i = 0; i < m; i = i + 3) {
            for (int j = 0; j < m; j = j + 3) {
                if (!isBlockValid(board, i, j)) return false;
            }
        }

        return true;

    }

    bool isRowValid(vector<vector<char>>& board, int row) {
        bool nums[10] = {false};
        for (auto c : board[row]) {
            if (c == '.') continue;
            if (nums[c - '0'])   return false;
            nums[c - '0'] = true;
        }

        return true;
    }

    bool isColumnValid(vector<vector<char>>& board, int col) {
        bool nums[10] = {false};
        int rowNum = board.size();
        for (int i = 0; i < rowNum; ++i) {
            char c = board[i][col];
            if (c == '.') continue;
            if (nums[c - '0'])  return false;
            nums[c - '0'] = true;
        }

        return true;
    }

    bool isBlockValid(vector<vector<char>>& board, int row, int col) {
        bool nums[10] = {false};
        for (int i = row; i < row + 3; ++i) {
            for (int j = col; j < col + 3; ++j) {
                char c = board[i][j];
                if (c == '.') continue;
                if (nums[c - '0']) return false;
                nums[c - '0'] = true;
            }
        }

        return true;
    }
};

results matching ""

    No results matching ""