暴力
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
set<char> st;
//测试每一行上是否有相同的数字
for(int i=0;i<9;i++)
{
st.clear();
for(int j=0;j<9;j++)
{
if(board[i][j]=='.')
continue;
if(st.find(board[i][j])!=st.end())
return false;
st.insert(board[i][j]);
}
}
//测试每一列
for(int j=0;j<9;j++)
{
st.clear();
for(int i=0;i<9;i++)
{
if(board[i][j]=='.')
continue;
if(st.find(board[i][j])!=st.end())
return false;
st.insert(board[i][j]);
}
}
//测试每一个九宫格
for(int i=0;i<9;i+=3)
{
for(int j=0;j<9;j+=3)
{
st.clear();
for(int m=i;m<i+3;m++)
{
for(int n=j;n<j+3;n++)
{
if(board[m][n]=='.')
continue;
if(st.find(board[m][n])!=st.end())
return false;
st.insert(board[m][n]);
}
}
}
}
return true;
}
};
用哈希优化后
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int r[9][9];
int t[9][9];
int s[9][9];
memset(r,0,sizeof(r));
memset(t,0,sizeof(t));
memset(s,0,sizeof(s));
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
char c=board[i][j];
if(c=='.') continue;
if(r[i][c-'1']>0||t[j][c-'1']>0||s[i/3*3+j/3][c-'1']>0)
return false;
r[i][c-'1']++;
t[j][c-'1']++;
s[i/3*3+j/3][c-'1']++;
}
}
return true;
}
};
再用位运算优化
用一个int型的数记录1到9出现的次数 而不是数组
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int r[9];
int t[9];
int s[9];
memset(r,0,sizeof(r));
memset(t,0,sizeof(t));
memset(s,0,sizeof(s));
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
int u=board[i][j]-'1';
if(board[i][j]=='.') continue;
if(((r[i]>>u)&1)||((t[j]>>u)&1)||((s[i/3*3+j/3]>>u)&1))
return false;
r[i]|=(1<<u);
t[j]|=(1<<u);
s[i/3*3+j/3]|=(1<<u);
}
}
return true;
}
};