class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
vector<vector<bool>> rows(9, vector<bool>(9, false));
vector<vector<bool>> cols(9, vector<bool>(9, false));
vector<vector<bool>> boxes(9, vector<bool>(9, false));
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if (board[i][j] != '.') {
int num = board[i][j] - '1';
int box_index = (i / 3) * 3 + j / 3;
if (rows[i][num] || cols[j][num] || boxes[box_index][num]) {
return false;
}
rows[i][num] = true;
cols[j][num] = true;
boxes[box_index][num] = true;
}
}
}
return true;
}
};
有点像哈希的思想
使用bool类型的row,cols,boxs来记录每一行,每一列,每一个box数字是否已经出现
这三个邻接表的第一个数字都表示原数字所在的行,列,box,
第二个数字表示在存储的数字,如果在board中出现了这个数字,就把这个数字的行号与数据值作为索引,置为true记录在rows中,cols和boxs同理。
if (rows[i][num] || cols[j][num] || boxes[box_index][num]) {
return false;
}通过这个来判断
之前没接触过这类题目,有点生疏,以后要多练练
上面的方法是牺牲空间换取时间。
刚刚又想到了一个简单粗暴的方法,不要牺牲空间。
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if (board[i][j] != '.') {
// Check row
for(int k = 0; k < 9; k++){
if(board[i][k] == board[i][j] && k != j)
return false;
}
// Check column
for(int k = 0; k < 9; k++){
if(board[k][j] == board[i][j] && k != i)
return false;
}
// Check 3x3 box
for(int k = 0; k < 9; k++){
int row = i / 3 * 3 + k / 3;
int col = j / 3 * 3 + k % 3;
if(board[row][col] == board[i][j] && (row != i || col != j))
return false;
}
}
}
}
return true;
}
};