36.有效数独
可以使用哈希表记录每一行、每一列、每一个小九宫格中,每个数字出现的次数。
只需要遍历数独一次,在遍历的过程中更新哈希表中的计数,并判断是否满足有效的数独的条件即可。
对于数独的第 i 行第 j 列的单元格,该单元格所在的小九宫格的行数和列数分别为 [i/3]和[j/3]。
http://t.csdn.cn/RcPWjhttp://t.csdn.cn/RcPWj
//原始思想:遍历每行每列每格装在set里
//其实:先全部遍历装在哈希表里,然后再看,也就是一次遍历
//关键:怎么很方便的在遍历的时候,填入哈希表,也就是判断数字在哪一个九宫格
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
vector<set<int>> row(9);
vector<set<int>> column(9);
vector<set<int>> box(9);
for(int i=0;i<9;++i){
for(int j=0;j<9;++j){
int temp=board[i][j]-'0';
if(temp<0||temp>9) continue;
if(column[j].count(temp)) return false;
else column[j].insert(temp);
if(row[i].count(temp)) return false;
else row[i].insert(temp);
int index=(3*(i/3)+j/3);
if(box[index].count(temp)) return false;
else box[index].insert(temp);
}
}
return true;
}
};
某个数 x + ’ 0 ’ 就是指将x转变为字符型
某个数 x - ’ 0 ’ 就是指将x转变为整型
自己只想到了暴力遍历,还因为不知道怎么比较数字字符、怎么确定数字所在字符块,难以动笔,最后借鉴了评论区大佬的写法,结果运行堆溢出了QWQ。
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
for(int i=0;i<board.size();i++){
for(int j=0;i<board[i].size();j++){
if(board[i][j]>='0'&&board[i][j]<='9'){
if(!getEffective(i,j,board)){
return false;
}
}
}
}
return true;
}
bool getEffective(int i,int j,vector<vector<char>>board){
for(int k=0;k<board[i].size();k++){
if(board[i][k]==board[i][j]&&k!=j){
return false;
}
}
for(int k=0;k<board.size();k++){
if(board[k][j]==board[i][j]&&k!=i){
return false;
}
}
int length=(i/3)*3;
int width=(j/3)*3;
for(int k1=length;k1<length+3;k1++){
for(int k2=width;k2<width+3;k2++){
if(board[k1][k2]==board[i][j]&&(k1!=i&&k2!=j)){
return false;
}
}
}
return true;
}
};
73. 矩阵置零
使用标记数组。
(自己只想到了碰到0就换,导致多置了0)
可以用两个标记数组分别记录每一行和每一列是否有零出现。
首先遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后再次遍历该数组,用标记数组更新原数组即可。(更新时行列数组可以一起)