题目说明
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character ‘.’.
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
分析
相关的博客分析是定义了标志矩阵,记录每行每列的该位置是否出现了重复的元素,但执行起来发现效率并不高。提交后看到别人运行效率较高的做法,倒是很直接。直接先遍历每一行,每一列,然后在每个3x3的小方格内进行判断。
这里需要注意一点就是
for( int p = i+1; p < i/3*3+3; p++) {
for( int q = j+1; q < j/3*3+3; q++)
if( board[i][j] == board[p][q])
return false;
并不能将方格内的所有元素遍历,如下的两个就比较不到,所以再给它一个循环。
下面把参考代码贴上来
C++代码
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
if(board.empty() || board[0].empty()) return false;
for(int i = 0; i < 9; i++) {
for(int j = 0; j < 9; j++) {
if( board[i][j] == '.')
continue;
//行进行判断
for( int p = j+1; p < 9; p++) {
if( board[i][j] == board[i][p])
return false;
}
//列进行判断
for( int q = i+1; q < 9; q++) {
if( board[i][j] == board[q][j])
return false;
}
for( int p = i+1; p < i/3*3+3; p++) {
for( int q = j+1; q < j/3*3+3; q++)
if( board[i][j] == board[p][q])
return false;
for( int q = j/3*3; q < j; q++)
if( board[i][j] == board[p][q])
return false;
}
}
}
return true;
}
};