力扣经典150题解析之三十四:有效的数独

news/2024/10/18 16:45:36/

目录

      • 解题思路与实现 - 有效的数独
        • 问题描述
        • 示例
        • 解题思路
        • 算法实现
        • 复杂度分析
        • 测试与验证
        • 总结
      • 感谢阅读!

解题思路与实现 - 有效的数独

问题描述

判断一个 9 x 9 的数独是否有效,根据以下规则验证已经填入的数字是否有效:

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

示例 1

输入:

[["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

示例 2

输入:

[["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

解题思路
  1. 遍历数独,分别使用三个二维数组 rowscolsboxes 来记录每行、每列以及每个 3x3 宫内出现的数字情况。
  2. 对于每个数字,判断它在当前行、当前列和当前 3x3 宫内是否已经出现过,若出现过则说明数独无效。
  3. 遍历结束后,若没有发现任何冲突,则数独有效。
算法实现
public boolean isValidSudoku(char[][] board) {boolean[][] rows = new boolean[9][9];boolean[][] cols = new boolean[9][9];boolean[][] boxes = new boolean[9][9];for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if (board[i][j] != '.') {int num = board[i][j] - '1';int boxIndex = (i / 3) * 3 + (j / 3);if (rows[i][num] || cols[j][num] || boxes[boxIndex][num]) {return false; // 重复出现}rows[i][num] = true;cols[j][num] = true;boxes[boxIndex][num] = true;}}}return true;
}
复杂度分析
  • 时间复杂度:O(1),因为固定为 9 x 9 的数独,算法的时间复杂度是常数级别的。
  • 空间复杂度:O(1),同样因为固定为 9 x 9 的数独,额外空间的大小也是常数级别的。
测试与验证

设计不同的数独输入,包括有效的和无效的情况,验证算法的正确性和效率。

总结

通过本文的详细解题思路和算法实现,可以有效地判断给定的数独是否有效。利用三个二维数组记录每行、每列和每个 3x3 宫内的数字出现情况,然后进行遍历验证,实现了对数独的有效性检查。

感谢阅读!


http://www.ppmy.cn/news/1432228.html

相关文章

STM32F4使用FPU/DSP核心启用与测试

STEP1、下载DSP库 具体链接如下&#xff1a; https://www.st.com/en/embedded-software/stsw-stm32065.html?dl9w6sdOSAKySFxBhN764Stg%3D%3D%2CIS1vzyA84KLAefK%2B0DawUl0FScREpiT6AdC3qFjIMJnCIgXIwr82G2XUFo6w43Wp5L5CUyrX3vZAoaHRE3nsTmRsArV3hnQOEgX73SKt8ss1vGrLlfXT24j…

PSAvatar:一种基于点的可变形形状模型,用于3D高斯溅射的实时头部化身创建

PSAvatar: A Point-based Morphable Shape Model for Real-Time Head Avatar Creation with 3D Gaussian Splatting PSAvatar&#xff1a;一种基于点的可变形形状模型&#xff0c;用于3D高斯溅射的实时头部化身创建 Zhongyuan Zhao1,2, Zhenyu Bao1,2, Qing Li1, Guoping Qiu3,…

uthash哈希库使用详解(增删改查和遍历,示例代码)

在C语言中&#xff0c;标准库并没有提供哈希表的实现&#xff0c;因此很多开发者需要自己实现哈希表&#xff0c;这通常是一个复杂且容易出错的过程。幸运的是&#xff0c;有像uthash这样的开源库可以帮助我们简化这一过程。本文将对uthash的使用进行详尽的讲解&#xff0c;包括…

开发语言漫谈-脚本语言

前面讲的都称之为编程语言&#xff0c;就是做系统用的。还有一大类称之为脚本语言的语言&#xff0c;这类语言数量极多&#xff0c;大部分程序员用不上&#xff0c;也不关心&#xff0c;这是系统维护人员专用的邻域。这个定义其实也很不准确&#xff0c;不必较真。更准确的来讲…

傅立叶变换与拉普拉斯变换的区别与联系?

傅里叶变换和拉普拉斯变换都是信号处理中的重要工具&#xff0c;它们有以下几个主要区别&#xff1a; 定义域&#xff1a;傅里叶变换是在频率域&#xff08;即虚轴&#xff09;上定义的&#xff0c;而拉普拉斯变换在复平面上的特定区域内定义。 适用范围&#xff1a;傅里叶变换…

Ubuntu22.04 + ROS2 Humble配置Moveit2环境

Ubuntu22.04 ROS2 Humble配置Moveit2环境 文章目录 Ubuntu22.04 ROS2 Humble配置Moveit2环境1.Ubuntu22.04配置ROS22.二进制安装Moveit23.配置Moveit的官方教程3.1安装rosdep3.2下载moveit的tutorials3.3安装中间件Middleware 4.启动测试用例Reference 环境配置&#xff1a; …

keytool证书工具详解(二)

JDK自带的keytool证书工具详解 一、生成证书 keytool -genkey -alias tomcat -keyalg RSA -keystore D:/tomcat.keystore -keypass 123456 -storepass 123456 -dname "CN=xingming,OU=danwei,O=zuzhi,L=shi,ST=sheng,C=CN" keytool -genkey -alias tomcat -keyalg …

Oracle删除数据库的步骤【谨慎操作】

在创建数据库的时候,有创建就会有删除,删除数据库的工作需要很多必要的条件 删除数据库会把所有库的数据文件、控制文件、日志文件等物理文件通通给删除掉!!!! 这时候你就可以跑路了。。。。。 1、模拟测试,创建一个测试库 -- 创建临时表空间 [root@cdp1 sql]#cat /d…