之前思考想要1次遍历即完成,但是想到27个set,最后采用3次遍历(通过map)完成判断,时间复杂度过高。
记录他人的解法(采用set):
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
set<string> r_set,c_set,g_set;
for(int i=0;i<9;++i){
for(int j=0;j<9;++j){
char ch = board[i][j];
if(ch!='.'){
int grid = ((i/3)*3+j/3);
string r_str = "r"+to_string(i)+string(ch,1);
string c_str = "c"+to_string(j)+string(ch,1);
string g_str = "g"+to_string(grid)+string(ch,1);
if(r_set.find(r_str)!=r_set.end()||c_set.find(c_str)!=c_set.end()||g_set.find(g_str)!=g_set.end())
return false;
r_set.insert(r_str);
c_set.insert(c_str);
g_set.insert(g_str);
}
}
}
return true;
}
};
最后贴上自己的代码(实在是又长又烂):
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
bool ans = judgerow(board)&&judgecol(board)&&judgebox(board);
return ans;
}
private:
map<char,int> maptest;
bool judgerow(vector<vector<char>>& board){
for(int i=0;i<9;++i){
maptest.clear();
for(int j=0;j<9;++j){
if(board[i][j]=='.')
continue;
map<char,int>::iterator iter;
iter = maptest.find(board[i][j]);
if(iter==maptest.end()){
maptest.insert(map<char,int>::value_type(board[i][j],1));
}
else{
return false;
}
}
}
return true;
}
bool judgecol(vector<vector<char>>& board){
for(int i=0;i<9;++i){
maptest.clear();
for(int j=0;j<9;++j){
if(board[j][i]=='.')
continue;
map<char,int>::iterator iter;
iter = maptest.find(board[j][i]);
if(iter==maptest.end()){
maptest.insert(map<char,int>::value_type(board[j][i],1));
}
else
return false;
}
}
return true;
}
bool judgebox(vector<vector<char>>& board){
for(int i=0;i<3;++i){
for(int j=0;j<3;++j){
maptest.clear();
for(int p=i*3;p<(i+1)*3;++p){
for(int q=j*3;q<(j+1)*3;++q){
if(board[p][q]=='.')
continue;
map<char,int>::iterator iter;
iter = maptest.find(board[p][q]);
if(iter==maptest.end()){
maptest.insert(map<char,int>::value_type(board[p][q],1));
}
else
return false;
}
}
}
}
return true;
}
};