Featured image of post Valid Sudoku

Valid Sudoku

36. 有效的数独

分析

  1. 行检查:

    • 遍历每一行,使用布尔数组记录数字是否出现过
  2. 列检查:

    • 遍历每一列,使用布尔数组记录数字是否出现过
  3. 3×3 宫格检查:

    • 每个 3×3 宫格起点分别是 (0,0)(0,3)(0,6)(3,0)
    • 遍历每个小宫格,判断是否有重复数字
  4. 数字映射:

    • 将字符 '1'~'9' 转换成索引 0 ~ 8,方便标记
  5. 发现重复直接返回 false,全部通过返回 true

时间复杂度

总时间复杂度 O(1)

空间复杂度

空间复杂度为 O(1)

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class Solution
{
public:
    bool isValidSudoku(vector<vector<char>>& board)
    {
        std::vector<bool> st(9);  // 标记数组,记录数字是否出现

        // 1. 检查每一行
        for (int i = 0; i < 9; ++i)
        {
            st = std::vector<bool>(9, false);  // 重置标记
            for (int j = 0; j < 9; ++j)
            {
                if (board[i][j] != '.')
                {
                    int num = board[i][j] - '1';  // 映射到 0~8
                    if (st[num])  // 数字重复
                        return false;
                    st[num] = true;  // 标记出现过
                }
            }
        }

        // 2. 检查每一列
        for (int i = 0; i < 9; ++i)
        {
            st = std::vector<bool>(9, false);  // 重置标记
            for (int j = 0; j < 9; ++j)
            {
                if (board[j][i] != '.')
                {
                    int num = board[j][i] - '1';
                    if (st[num])  // 数字重复
                        return false;
                    st[num] = true;
                }
            }
        }

        // 3. 检查每个 3×3 宫格
        for (int i = 0; i < 9; i += 3)
            for (int j = 0; j < 9; j += 3)
            {
                st = std::vector<bool>(9, false);  // 重置标记
                for (int x = 0; x < 3; ++x)
                    for (int y = 0; y < 3; ++y)
                    {
                        if (board[i + x][j + y] != '.')
                        {
                            int num = board[i + x][j + y] - '1';
                            if (st[num])  // 数字重复
                                return false;
                            st[num] = true;
                        }
                    }
            }

        return true;  // 所有检查通过
    }
};
Built with Hugo
Theme Stack designed by Jimmy