【C语言】算法好题初阶(每日小细节016)

每日小细节新增算法好题合集,现在是初阶,每天会更新至少两道题目,感兴趣的小伙伴赶紧关注收藏不迷路哦

花费几分钟就能积累一种新的解题思路多是一件美事啊~

 

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;
    }
}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值