题目链接

题目描述

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

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

数独部分空格内已填入了数字,空白格用 '.' 表示。
注意:

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

    示例

    36.png

    示例1:

    输入:board = [[“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”]]

输出:true

提示

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字或者 '.'

    思路

    遍历

    从头开始遍历,并分别对行、列、小宫格里的数字进行计数即可。

    题解

    1. class Solution {
    2. public:
    3. bool isValidSudoku(vector<vector<char>>& board) {
    4. int rows[9][9] = {0};
    5. int cols[9][9] = {0};
    6. int subboxes[3][3][9] = {0};
    7. for (int i = 0; i < 9; ++i) {
    8. for (int j = 0; j < 9; ++j) {
    9. char c = board[i][j];
    10. if (c != '.') {
    11. int index = c - '0' - 1;
    12. ++rows[i][index];
    13. ++cols[j][index];
    14. ++subboxes[i / 3][j / 3][index];
    15. if (rows[i][index] > 1 || cols[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) {
    16. return false;
    17. }
    18. }
    19. }
    20. }
    21. return true;
    22. }
    23. };

    复杂度分析

  • 时间复杂度:0036-有效的数独 - 图2

  • 空间复杂度:0036-有效的数独 - 图3