每日一题_36. 有效的数独
题目:
题意分析:
这一题是一个常规题吧,就是让我们判断一个数独题目是不是正确的,但是注意这不是让我们判断数独本省有没有解,只是让我们判断这个数独题目本身满不满足数独的条件。
这道题没什么太多的算法,就是有两个技巧吧,一个是记录每行每列九宫格里字符出现的个数,因为范围固定在字符1-9,因此可以用一个int数组来当作hash表,键值就是ch(char) - ‘0’。
另一个处理的就是遍历九宫格了,官方答案给的是一次遍历,但是我一开始想的就是分开遍历,在遍历九宫格,有思考一会儿。官答是直接开了一个三维数组([3][3][9])来记录每行每列的九宫格,我思维比较直接就用一个一维数组,单独遍历每个九宫格进行检验,遍历的时候找到每个小九宫的起点,也就是(0,0),(0,3),(0,6)… … 找到起点之后,每个九宫格有九个数,遍历然后在起点的基础上加上偏移就行了(k / 3, k % 3)。
代码:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int a[10];
for (int i = 0; i < 9; i ++)
{
memset(a, 0, sizeof a);
for (int j = 0; j < 9; j ++)
if ((board[i][j] != '.') && ++ a[board[i][j] - '0'] > 1) return false;
}
for (int i = 0; i < 9; i ++)
{
memset(a, 0, sizeof a);
for (int j = 0; j < 9; j ++)
if ((board[j][i] != '.') && (++ a[board[j][i] - '0'] > 1)) return false;
}
for (int i = 0; i < 9; i += 3)
for (int j = 0; j < 9; j += 3)
{
memset(a, 0, sizeof a);
for (int k = 0; k < 9; k ++)
{
int row = i + k / 3, col = j + k % 3;
if (board[row][col] != '.' && ++ a[board[row][col] - '0'] > 1) return false;
}
}
return true;
}
};