原题链接:https://leetcode-cn.com/problems/valid-sudoku/
一开始想的办法就是利用map保存数据,遍历整个数组三次。
看了一些题解可以使用位运算。
用三个数组保存横、竖、九宫格内的情况。
例如x[i]就代表第i行的情况。维护x[i]内保存的数据。用&判断在同一行是否出现过,用|更新数据。
一开始为0,可以看成000000000,在后续更新其实就是不断往里填1,判断就是断某一位上的1是否已经出现。
要注意位运算时候的运算符优先级。在必要的地方加好括号。
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
vector<int> x(9, 0);
vector<int> y(9, 0);
vector<int> z(9, 0);
for (int i = 0 ; i < 9 ; ++i)
{
for (int j = 0 ; j < 9 ; ++j)
{
if (board[i][j] == '.')
{
continue;
}
int num = 1 << (board[i][j] - '1');
if (((num & x[i]) == 0) && ((num & y[j]) == 0 )&& ((num & z[i / 3 *3 + j / 3]) == 0))
{
x[i] = num | x[i];
y[j] = num | y[j];
z[i / 3 * 3 + j / 3] = z[i / 3 * 3 + j / 3] | num;
}
else
{
return false;
}
}
}
return true;
}
};