每日小细节新增算法好题合集,现在是初阶,每天会更新至少两道题目,感兴趣的小伙伴赶紧关注收藏不迷路哦
花费几分钟就能积累一种新的解题思路多是一件美事啊~
1.有效的数独力扣传送
其实这个题目并不简单,但是写起来稍微有点绕
一定要注意两个标注的地方,很容易错
其实只要依次行遍历,列遍历,3*3遍历就不会有问题
bool isValidSudoku(char** board, int boardSize, int* boardColSize){
int count=0;
int *tmp=(int*)malloc(sizeof(int)*10);
for(int i=0;i<9;i++)
{
for(int k=0;k<=9;k++)
{
tmp[k]=0;
}
for(int j=0;j<9;j++)
{
if(board[i][j]!='.') //一定要注意这个if是嵌套的!!!!!!!!!
{
tmp[board[i][j]-48]++;
if(tmp[board[i][j]-48]==2)
{
return false;
}
}
}
}
for(int i = 0; i < 9; i++){//列判断
for(int k = 0; k <= 9; k++)tmp[k] = 0;
for(int j = 0; j < 9; j++){
if(board[j][i] != '.'){
tmp[board[j][i] - 48]++;
if(tmp[board[j][i] - 48] == 2)return false;
}
}
}
for(int i = 0; i < 7; i += 3){//3*3判断
for(int k = 0; k <= 9; k++)tmp[k] = 0;
for(int j = 0; j < 9; j++){
if(count % 3 == 0)//每判断一个3*3就清零
for(int k = 0; k <= 9; k++)tmp[k] = 0;
if(board[i][j] != '.'){
tmp[board[i][j] - 48]++;
if(tmp[board[i][j] - 48] == 2)return false;
}
if(board[i + 1][j] != '.'){
tmp[board[i + 1][j] - 48]++;
if(tmp[board[i + 1][j] - 48] == 2)return false;
}
if(board[i + 2][j] != '.'){
tmp[board[i + 2][j] - 48]++;
if(tmp[board[i + 2][j] - 48] == 2)return false;
}
count++;//为3的倍数就说明该3*3已判断完毕
}
}
return true;
}
2.矩阵置0力扣传送
其实只需要标记0出现的位置,然后把那个位置的行和列置空就可以
void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
int row[matrixSize];
int line[*matrixColSize];
memset(row,0,sizeof(row));
memset(line,0,sizeof(line));
for(int i=0;i<matrixSize;i++)
{
for(int j=0;j<*matrixColSize;j++)
{
if(matrix[i][j]==0)
{
row[i]=1;
line[j]=1;
}
}
}
for(int i=0;i<matrixSize;i++)
{
for(int j=0;j<*matrixColSize;j++)
{
if(row[i]||line[j])
matrix[i][j]=0;
}
}
}