Leetcode 36:有效的数独

【中等】力扣算法题解析LeetCode36:有效的数独 本文提出了一种高效验证数独有效性的算法,通过位掩码技术优化空间使用。使用三个整数数组分别记录行、列、3x3宫格内数字出现情况,将每个数字转换为位掩码进行检测。遍历9x9网格时,检查当前数字在位掩码中是否冲突,若无冲突则更新掩码。宫格索引通过(i/3)*3 + j/3计算。该方法仅需27个整数的存储空间,利用位运算实现高效检测,时空复杂度均为O(1)。Java实现代码简洁,通过字符转换、位运算和索引计算快速验证数独有效性。 阅读详情

题目描述

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

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 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
解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。
但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

说明:

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。
  • 给定数独序列只包含数字 1-9 和字符 ‘.’ 。
  • 给定数独永远是 9x9 形式的。

我的解法:利用set特性,将判断分为三个步骤

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        set<char> s;
        //行重复检测
        for (int m = 0; m < 9; m++){
            for (int n = 0; n < 9; n++){
                if (board[m][n] != '.'){
                    if (s.count(board[m][n])){ return false; }
                    else{ s.insert(board[m][n]); }
                }
            }
            s.clear();
        }

        //列重复检测
        for (int n = 0; n < 9; n ++){
            for (int m = 0; m < 9; m++){
                if (board[m][n] != '.'){
                    if (s.count(board[m][n])){ return false; }
                    else{ s.insert(board[m][n]); }
                }
            }
            s.clear();
        }

        int m0, m1, n0, n1;
        //块重复检测
        for (int m = 0; m < 9; m++){
            for (int n = 0; n < 9; n++){
                if (board[m][n] != '.'){
                    if (m % 3 == 0){ m0 = m + 1; m1 = m + 2; }
                    else if (m % 3 == 1){ m0 = m - 1; m1 = m + 1; }
                    else{ m0 = m - 2; m1 = m - 1; }

                    if (n % 3 == 0){ n0 = n + 1; n1 = n + 2; }
                    else if (n % 3 == 1){ n0 = n - 1; n1 = n + 1; }
                    else{ n0 = n - 2; n1 = n - 1; }

                    if (m0 > m){
                        if (board[m0][n0] != '.'){ s.insert(board[m0][n0]); }
                        if (board[m0][n1] != '.'){ s.insert(board[m0][n1]); }
                    }
                    if (m1 > m){
                        if (board[m1][n0] != '.'){ s.insert(board[m1][n0]); }
                        if (board[m1][n1] != '.'){ s.insert(board[m1][n1]); }
                    }
                    if (s.count(board[m][n])){ return false; }
                    s.clear();
                }
            }
        }
        return true;
    }
};

虽然程序执行效果还不错,运行时间和空间均超过了百分之80多的解答,但是代码比较复杂,可读性差,下面是别人家的改进解法。

别人家的解法:用算法代替了多个if定义

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        vector<unordered_set<int>> row(9);
        vector<unordered_set<int>> col(9);
        vector<unordered_set<int>> block(9);
        for(int i = 0; i < 9; ++ i){
            for(int j = 0; j < 9; ++ j){
                int bindex =  (i / 3)* 3 + j / 3;
                char cur = board[i][j];
                if(cur == '.')  continue;
                if(row[i].count(cur) || col[j].count(cur) || block[bindex].count(cur))  return false;
                row[i].insert(cur);
                col[j].insert(cur);
                block[bindex].insert(cur);
            }
        }
        return true;
    }
};

可以看到,将判断合三为一,大大减少了代码量。特别注意以下两点:

  1. set、hash等容器都可以定义容器数组,此操作省去了连续定义多个容器的问题。
  2. 注意这个代码:bindex = (i / 3)* 3 + j / 3,它的功能是定位到元素所在的9格块,此思想解决了我的代码中定义了一堆if的问题。
LeetCode 第36题:有效的数独 题目要求我们编写一个算法来判断一个 9x9 的数独是否有效。数字1-9在每一行只能出现一次。数字1-9在每一列只能出现一次。数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。一个有效的数独(部分已被填充)不一定是可解的。只需要根据已经填入的数字要求验证即可。空的单元格用'.'表示。例如:原因:第一列有两个8。通过这个数独小侦探的过程,我们学会了如何检查一个数独是否有效。利用哈希表的方法,我们能够在O(1)的时间复杂度内完成每一个格子的检查,整体时间复杂度为O(n^2),其中n。 阅读详情

相关推荐

leetcode: 36.有效的数独

验证已经填入的数字是否有效即可。来源:力扣(LeetCode)

uncle_ll的博客 318

leetcode力扣:36. 有效的数独

基本思路: 判断数独有效要满足三个条件: 1.每行数字1-9没有重复的 2.每列数字1-9没有重复的 3.每个九宫格数字1-9没有重复的 我的思路就是,用ascall码自建哈希表,记录出现的次数,如果每行,每列或者每个九宫格同一个数字出现的次数大于一次就输出false 代码实现: class Solution { public boolean isValidSudoku(char[][] board) { //记录每行1到9每个数字出现的个数 int ...

IAMZTDSF的博客 622

leetcode:36. 有效的数独

题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-sudoku 请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 注意: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据

uncle_ll的博客 235

LeetCode之旅:36. 有效的数独

题意: 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 1、数字 1-9 在每一行只能出现一次。 2、数字 1-9 在每一列只能出现一次。 3、数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 示例 1: 输入: [ [“5”,“3”,".",".",“...

路漫漫其修远兮,吾将上下而求索。 373

VSCode 远程开发:实现服务器图形化界面(GUI)的高效操作指南

本文详细介绍了如何通过VSCode远程开发实现服务器图形化界面(GUI)操作,包括X11转发原理、完整配置指南和实战测试。通过安装Xming、配置SSH连接和服务器端设置,开发者可以高效地在本地显示远程GUI应用,提升开发效率。

weixin_29245767的博客 292

各种AI的调试日记——辅助工作篇

记录使用各种AI(语言大模型)的心得和总结

m0_73056986的博客 1392

LeetCode36:有效的数独

LeetCode36:有效的数独题目说明分析C++代码 题目说明 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character ‘...

坚果 211

win11下的MySQL安装

目前官方最新版本是8.0.26,考虑到其稳定性、可靠性还需一定周期保证,所以使用官方版求稳定仍然建议5.7系列。3、选择MySQL Servers 5.7.38 -x64,然后按绿色箭头将选中的版本移植到右边选中框中。4、点击下方蓝色Advanced Options,选择安装位置。1、在开始界面搜索MySQL,点击command line。4、在“系统变量”中选择“path”,点击编辑。5、新建——>增加MySQL路径——>确定,12、execute,安装好后next。9、不需要做修改,直接点击next。.

rensweet的博客 2万+

leetcode 36: 是否有效数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。只需要根据以上规则,验证已经填入的数字是否有效即可。一个有效的数独(部分已被填充)不一定是可解的。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。空白格用 ‘.’ 表示。

m0_55284524的博客 49

高效网络流量回放:使用tcpreplay实现多目标IP的pcap重放

本文详细介绍了如何使用tcpreplay工具高效回放网络流量pcap文件,并实现多目标IP发送。通过tcprewrite编辑报文和并行回放策略,可满足安全测试、负载测试等场景需求。文章涵盖安装、基础回放、核心技巧及性能优化,帮助读者构建真实流量压力测试环境。

weixin_29297127的博客 480

VS2019项目使用CGAL6.1配置教程详细步骤

在VS2019项目中使用CGAL详细步骤

插件开发 331

刷题笔记:力扣第36题-有效的数独

本文比较了两种数独有效性验证的算法实现。第一种采用暴力解法,通过三次独立循环分别检查行、列和3×3宫格,使用标记数组判断重复元素。第二种是官方优化方案,通过定义三个二维数组(行、列、宫格)在一次双重循环中完成所有检查,利用空间换时间策略简化代码。两种方法核心思路相同,但官方方案更简洁高效,通过计算宫格索引公式(i/3)*3+(j/3)实现同步验证。最终都返回布尔值表示数独是否有效。

hanlin03的博客 182

【系统架构设计师】预测试卷四:综合知识(75道选择题)

本文整理系统架构设计师考试高频考点,涵盖计算机系统基础、计算机网络、数据库、软件工程与UML四大模块,共28道典型题目。重点解析Cache局部性原理、RISC/CISC区别、TCP三次握手、B+树索引优势、CAP定理、螺旋模型特点等核心概念,并标注易错选项,帮助考生快速掌握解题思路。 关键词:系统架构、Cache、RISC、TCP、B+树、CAP定理、螺旋模型

数据知道的博客 546

leetcode36:有效的数独

每行中数字1-9不能重复。每列中数字1-9不能重复。每个 3×33 \times 33×3 的小方格内数字1-9不能重复。一个 9×99 \times 99×9 的二维数组board,其中每个元素为字符'1'到'9'或'.'(代表空格)。布尔值,true表示数独有效,false表示无效。棋盘大小固定为 9×99 \times 99×9。数组中仅包含'1'到'9'或'.'。棋盘可能只部分填充。检查行:对于每一行,用一个集合来记录该行中已出现的数字。如果数字重复出现,则判定数独无效。

D2510466299的博客 960

定位教程7---旋转中心标定之方法二

手算相机相对机器人关系

Quintin 6230

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Leetcode 36: 有效的数独

题目描述: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 注意: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。 空白格用 ‘.’ 表示。 示例: 1. 输入:board = [[“5”,“3”,".",".",“7”,".",".",".",

coding_diamond的博客 1422

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

力扣—36:有效的数独 题解

先给题目: 请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 '.' 表示。 注意: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。 示例 1: 输入:bo...

zjsru_Beginner的博客 477

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

leetcode:36. 有效的数独

直观上,我们很容易想到使用哈希表来记录某行/某列/某个小方块出现过哪些数字,来帮助我们判断是否符合「有效数独」的定义。其实,另外,我们可以将box定义成三维数组,更好理解。

OceanStar的博客 1073

【LeetCode 题解】算法:36.有效的数独

在算法领域中,数独问题是一个经典且有趣的逻辑验证题目。本题的核心任务是判断一个给定的 9x9 数独是否有效。

小高的博客 996

LeetCode 36:有效的数独

目录LeetCode 36:有效的数独题目描述解题 LeetCode 36:有效的数独 题目描述 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 示例 1: 输入: [ [“5”,“3”,".",".",“7”,".",".",".","

s_Shune 210

leetcode 36:有效的数独

题目传送门 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 示例 1: 输入: [ [“5”,“3”,".",".",“7”,"....

qq_43353709的博客 168

【LeetCode: 36. 有效的数独 + 模拟】

【LeetCode: 36. 有效的数独 + 模拟】请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

Coder_ljw的博客 1022

【LeetCode】第36题——有效的数独(难度:中等)

【LeetCode】第36题——有效的数独(难度:中等)题目描述解题思路代码详解注意点 题目描述 请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 注意: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效

Se7en_Dayz的博客 431
上一篇: 刷Leetcode收获的关键知识与相对应的算法题索引(持续更新中)
下一篇: Leetcode 242:有效的字母异位词
冀州少主
博客等级 码龄8年 16粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值