• 【LeetCode】36、有效的数独


    36、有效的数独

    题目:

    请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

    1. 数字 1-9 在每一行只能出现一次。
    2. 数字 1-9 在每一列只能出现一次。
    3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

    .
    注意:

    一个有效的数独(部分已被填充)不一定是可解的。
    只需要根据以上规则,验证已经填入的数字是否有效即可。
    空白格用 '.' 表示。

    示例1:

    在这里插入图片描述

     输入:board = 
     [["5","3",".",".","7",".",".",".","."]
     ,["6",".",".","1","9","5",".",".","."]
     ,[".","9","8",".",".",".",".","6","."]
     ,["8",".",".",".","6",".",".",".","3"]
     ,["4",".",".","8",".","3",".",".","1"]
     ,["7",".",".",".","2",".",".",".","6"]
     ,[".","6",".",".",".",".","2","8","."]
     ,[".",".",".","4","1","9",".",".","5"]
     ,[".",".",".",".","8",".",".","7","9"]] 
     
    输出:true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    示例2:

    输入:board = 
    [["8","3",".",".","7",".",".",".","."]
    ,["6",".",".","1","9","5",".",".","."]
    ,[".","9","8",".",".",".",".","6","."]
    ,["8",".",".",".","6",".",".",".","3"]
    ,["4",".",".","8",".","3",".",".","1"]
    ,["7",".",".",".","2",".",".",".","6"]
    ,[".","6",".",".",".",".","2","8","."]
    ,[".",".",".","4","1","9",".",".","5"]
    ,[".",".",".",".","8",".",".","7","9"]]
    输出:false
    解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    提示:

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

    解题思路:

    乍一看此题,完全没有思路,默默的打开了讨论区,看着大家的天才解法,不由的陷入了一阵深思…

    先说一下暴力解法:

    1. 先对整个board进行一次遍历,查找是否在每一行以及每一列有相同的元素
    2. 再对每个box进行遍历,使用Set来查找每个box中是否有相同的元素
    3. 如果不能添加说明有重复元素

    参考代码:

      public boolean isValidSudoku(char[][] board) {
            for (int i = 0; i < 9; i++){
                for (int j = 0; j < 9; j++){
                    if (board[i][j]!= '.'){
                        //判断这一行中是否有相同元素
                        for (int k = j+1; k < 9; k ++){
                            if (board[i][j] == board[i][k] ){
                                return false;
                            }
                        }
    
                        //判断这一列中是否有相同元素
                        for (int k = i+1; k<9; k++){
                            if (board[i][j] == board[k][j]){
                                return false;
                            }
                        }
                    }
                }
            }
    
            //判断每个一box中是否有相同元素
            for (int i = 0; i < 9; i=i+3){
                for (int j = 0; j < 9; j = j+3){
                    Set<Character> set = new HashSet<>();
                    for (int k = 0; k <3; k++){
                        for (int l = 0; l < 3; l++){
                            if (board[i + k][j + l]!= '.' && !set.add(board[i + k][j + l])){
                                return false;
                            }
                        }
                    }
                }
            }
    
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在这里插入图片描述

  • 相关阅读:
    香港服务器怎么看是CN2 GT线路还是CN2 GIA线路?
    Android SurfaceFlinger导读(02)MessageQueue
    手绘地图制作的关键点之“图层覆盖”
    码农在长沙如何流浪
    自动驾驶测绘资质的信息安全要求,真的来了
    DPDK 数据传输流程
    错误处理函数 / 模板上下文处理函数
    stable diffusion十七种controlnet详细使用方法总结
    java毕业设计开题报告论文基于JavaWeb项目实现的高校学生在线选课系统
    vue组件之间的传值方式
  • 原文地址:https://blog.csdn.net/weixin_44427181/article/details/126053084