力扣面试150题--有效的数独
Day 19
题目描述
思路
其实还挺简单的,主要的难点在于如何判断每个小数独是否满足要求
详细见代码
class Solution {
public boolean isValidSudoku(char[][] board) {
HashSet<Character> set= new HashSet<>();//处理行
HashSet<Character> set1= new HashSet<>();//处理左边第一个小数独
HashSet<Character> set2= new HashSet<>();//处理左边第二个小数独
HashSet<Character> set3= new HashSet<>();//处理左边第三个小数独
HashSet<Character> set4= new HashSet<>();//处理列
for(int i=0;i<9;i++){//行
set.clear();//每次换行,清空set
if(i==0||i==3||i==6){
//由于小数独不好处理,可以发现0 3 6分别为三行小数独的起始行
set1.clear();
set2.clear();
set3.clear();
}
set4.clear();//列set清空
for(int j=0;j<9;j++){
if(board[i][j]!='.'){
if(set.contains(board[i][j])){//行如果存在重复
return false;
}
else{//行不存在重复,加入set
set.add(board[i][j]);
}
if(j<3){//第一个数独
if(set1.contains(board[i][j])){
return false;
}
set1.add(board[i][j]);
}
if(3<=j&&j<6){//第二个数独
if(set2.contains(board[i][j])){
return false;
}
set2.add(board[i][j]);
}
if(6<=j){//第三个数独
if(set3.contains(board[i][j])){
return false;
}
set3.add(board[i][j]);
}
}
if(board[j][i]!='.'){//列
if(set4.contains(board[j][i])){
return false;
}
set4.add(board[j][i]);
}
}
}
return true;
}
}