✨【Code皮皮虾】多方法,全面注释解析,解决——>《36. 有效的数独》

举报
Code皮皮虾 发表于 2021/09/21 22:32:46 2021/09/21
【摘要】 ✨【Code皮皮虾】多方法,全面注释解析,解决——>《36. 有效的数独》

Code皮皮虾 一个沙雕而又有趣的憨憨少年,和大多数小伙伴们一样喜欢听歌、游戏,当然除此之外还有写作的兴趣,emm…,日子还很长,让我们一起加油努力叭🌈

🌈题目

👉力扣链接

image.png

注意

image.png



🔥思路讲解

因为题目给出的范围

board.length == 9
board[i].length == 9
board[i][j] 是一位数字或者 ‘.’

所以,以示例一为例,整个数组分为9个小数组每个小数组中不能出现重复数字可采用 / 3的方式确定在哪个小数组

image.png

所以,我们可以采用三维数组的方式来实现



🌊三维数组

class Solution {
    public boolean isValidSudoku(char[][] board) {
        
        //因为数字 1-9 在每一行只能出现一次。
        int[][] rows = new int[9][9];

        //因为数字 1-9 在每一列只能出现一次。
        int[][] cols = new int[9][9];

        //三维,数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
        int[][][] tmps = new int[3][3][9];
        

        //一次遍历
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                char c = board[i][j];

                //如果当前字符不是 . 才进行判断
                if (c != '.') {
                    //将字符转化为int类型的索引
                    int index = c - '0' - 1;
                    //当前行,这个索引,即这个数字已经出现一次
                    rows[i][index]++;

                    //当前列,这个索引,即这个数字已经出现一次
                    cols[j][index]++;

                    //当前这个小数组,这个索引,即这个数字已经出现一次,通过 / 3来确定在哪个小数组
                    tmps[i / 3][j / 3][index]++;
                    
                    //条件判断,如果 > 1,说明重复,则return false;
                    if (rows[i][index] > 1 || cols[j][index] > 1 || tmps[i / 3][j / 3][index] > 1) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}



⛄采用二维实现



😁思路讲解

想要从三维降到二维,就需要通过巧妙的方法来确定在哪个小数组,这是关键!!!


如何确定?

公式先告诉大家:(i / 3) * 3 + j / 3,通过这个公式就可以确定,不信我们来验证验证🔥

以示例一为例

  1. 比如说:第三个小数组中的6,它的坐标为(2,7),通过公式得出(2 / 3) * 3 + 7 / 3 = 2,也就是下标为2的小数组也就是第三个数组
  2. 再来,第七个小数组中的6,它的坐标为(6,1),通过公式得出(6 / 3) * 3 + 1 / 3 = 6,下标为6,也就是第七个小数组

image.png

😋代码实现

class Solution {
    public boolean isValidSudoku(char[][] board) {


        int[][] rows = new int[10][10];
        int[][] cols = new int[10][10];
        //三维降二维
        int[][] tmps = new int[10][10];

        char ch = ' ';
        int tmp = 0;


        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                ch = board[i][j];
                if (ch == '.') continue;
                tmp = ch - '0';

                //套公式计算在哪个小数组
                int idx = i / 3 * 3 + j / 3;
                rows[i][tmp] += 1;
                cols[j][tmp] += 1;
                tmps[idx][tmp] += 1;

                if (rows[i][tmp] > 1 || cols[j][tmp] > 1 || tmps[idx][tmp] > 1) return false;             
            }
        }
        return true;
    }
}

当然,也可以通过boolean数组来判断


💖最后

我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!

创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以==一键三连哦!==,感谢支持,我们下次再见~~~

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。