1. 题目来源
链接:36. 有效的数独
2. 题目解析
大水题,模拟。
开个判重的 bool
数组,分别对行、列、九宫格检查是否有重复元素即可。
列就是行的 i
,j
交换,九宫格就是枚举每个九宫格的左上角起点,再加上行列 3 的偏移量即可。
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
O
(
1
)
O(1)
O(1)
代码:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
bool st[9];
// 判断行
for (int i = 0; i < 9; i ++ ) {
memset(st, 0, sizeof st);
for (int j = 0; j < 9; j ++ ) {
if (board[i][j] != '.') {
int t = board[i][j] - '1';
if (st[t]) return false;
st[t] = true;
}
}
}
// 判断列
for (int i = 0; i < 9; i ++ ) {
memset(st, 0, sizeof st);
for (int j = 0; j < 9; j ++ ) {
if (board[j][i] != '.') {
int t = board[j][i] - '1';
if (st[t]) return false;
st[t] = true;
}
}
}
// 判断九宫格
for (int i = 0; i < 9; i += 3) {
for (int j = 0; j < 9; j += 3) {
memset(st, 0, sizeof st);
for (int x = 0; x < 3; x ++ ) {
for (int y = 0; y < 3; y ++ ) {
if (board[i + x][j + y] != '.') {
int t = board[i + x][j + y] - '1';
if (st[t]) return false;
st[t] = true;
}
}
}
}
}
return true;
}
};