36.有效的数独,超简单做法,一看就懂

评论区看到的,只能说官方题解__都不看。
从左往右、从上往下的顺序遍历一次board,完成3个条件的检验,这其中有个j/3 + (i/3)*3最关键,用来判断是否每个数是否存在box中,j/3 + (i/3)*3的解析如下:在3*9的矩阵中,每个数属于哪个box就只取决于纵坐标,纵坐标为0/1/2的都属于box[0],纵坐标为3/4/5的都属于box[1],纵坐标为6/7/8的都属于box[2].也就是j/3。而对于9x9的矩阵,我们光根据j/3得到0/1/2还是不够的,可能加上一个3的倍数,例如加0x3,表示本行的box,加1x3,表示在下一行的box,加2x3,表示在下两行的box,这里的0/1/2怎么来的?和j/3差不多同理,也就是i/3

class Solution {
    public boolean isValidSudoku(char[][] board) {
        // 存储每一行的每个数是否出现过,默认初始情况下,每个数都没出现过
        int [][]row  =new int[9][9];
        int [][]col  =new int[9][9];
        int [][]box  =new int[9][9];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j]=='.'){
                    continue;
                }
                // -0为了转数字,-1是为了出现9*9数组,不然就把上面数组的[9][9]->[9][10]
                int curNum = board[i][j]-'0' - 1;
                // 判断是否在行、列、box中出现
                if (row[i][curNum]==1){
                    return false;
                }
                if (col[j][curNum]==1){
                    return false;
                }
                if (box[j/3 + (i/3) * 3][curNum]==1){
                    return false;
                }
                // 之前都没出现过,现在出现了,下次再遇见直接false
                row[i][curNum]=1;
                col[j][curNum]=1;
                box[j/3 + (i/3) * 3][curNum]=1;
            }
        }
        return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值