1.题意
给定一个数独,判断是否有效。判定条件:一行/列/3*3九宫格中同一个数字只能出现一次。
注意:
1.判断有效即可,不用考虑是否有解
2.board[i][j] is a digit 1-9 or ‘.’ 不用考虑非法(1-9以外)的情况
2.算法
模拟/暴力
3.总结
本题有3个小细节:
1.char到int的转换,-'0’即可。很多题解是-'1’或者-‘0’-1,之所以如此是因为最开始开的是99的数组,实际这个操作-'0’就可以,数组开成1010就好。
2.3x3九宫格如何用一维坐标表示?3*(行/3)+列/3。这里最开始并没有想到,看了题解才意识到可以这样做。
3.c++初始化数组可以直接={0},这样就不用写三遍memset了。
4.代码
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int rowmark[10][10], colmark[10][10], cellmark[10][10], num;
memset(rowmark, 0, sizeof(rowmark));
memset(colmark, 0, sizeof(colmark));
memset(cellmark, 0, sizeof(cellmark));
for(int i = 0;i < 9;i++){
for(int j = 0;j < 9;j++){
if(board[i][j] != '.'){
num = board[i][j] - '0';
if(rowmark[i][num] || colmark[j][num] || cellmark[(i/3)*3+j/3][num])
return false;
rowmark[i][num] = 1;
colmark[j][num] = 1;
cellmark[(i/3)*3+j/3][num] = 1;
}
}
}
return true;
}
};
5.复杂度
时间复杂度O(n2)
空间复杂度O(n2)