力扣每日一题36:有效的数独

news2024/10/2 22:16:06

题目描述:

请你判断一个 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

示例 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 存在, 因此这个数独是无效的。

提示:

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

通过次数

396.1K

提交次数

627.9K

通过率

63.1%

思路和题解:

题目已经给出了数独有效的三个规则,并且这三个规则都满足才能保证数独有效,我们可以针对每一个规则都判断一遍。对于规则1,我们可以把每一行都判断一遍,由于给出的是一个不完整的数独,所以只要查看每一行是否有重复即可,不用判断是否每一个都刚好出现一次。对于规则2,只是把行换成了列而已。对于规则3,我们只要判断每个九宫格就行了。下面是这种方法的代码:

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        //判断3*3宫格
        int i=0,j=0;
        int row=0,col=0;
        while(row<7)
        {
            col=0;
            while(col<7)
            {
                int visited[10]={0};
                for(i=row;i<row+3;i++)
                {
                    for(j=col;j<col+3;j++)
                        if(board[i][j]>='1'&&board[i][j]<='9')
                            visited[board[i][j]-'0']++;
                }
                for(i=1;i<=9;i++)
                    if(visited[i]>1)
                        return false;
                col+=3;
            }
            row+=3;
        }
        //判断每一行
        for(row=0;row<9;row++)
        {
            int visited[10]={0};
            for(col=0;col<9;col++)
            {
                if(board[row][col]>='1'&&board[row][col]<='9')
                        visited[board[row][col]-'0']++;
            }
            for(i=1;i<=9;i++)
                    if(visited[i]>1)
                        return false;
        }
        //判断每一列
        for(col=0;col<9;col++)
        {
            int visited[10]={0};
            for(row=0;row<9;row++)
            {
                if(board[row][col]>='1'&&board[row][col]<='9')
                        visited[board[row][col]-'0']++;
            }
            for(i=1;i<=9;i++)
                    if(visited[i]>1)
                        return false;
        }
        return true;
    }
};

对于上述的方法,如果运气不好的话,我们要遍历三次九宫格才能判断出一个九宫格是否有效。如果我们用三个数组分别记住每一行的数字1-9出现的次数、每一列的数字1-9出现的次数、每一个九宫格的数字1-9出现的次数,每次遍历的时候如果遍历的是'.',那就直接遍历下一个;如果出现的是数字num,那么就对应行的数字+1,对应列的数字+1,对应九宫格的数字+1,在+1后,如果对应行的数字>1或对应列的数字>1或对应九宫格的数字>1,那就放回false。遍历结束返回true。由于官方题解的代码我和的思路差不多,而且可读性更强,所以我就直接给出了官方题解代码。

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int rows[9][9];
        int columns[9][9];
        int subboxes[3][3][9];
        
        memset(rows,0,sizeof(rows));
        memset(columns,0,sizeof(columns));
        memset(subboxes,0,sizeof(subboxes));
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                char c = board[i][j];
                if (c != '.') {
                    int index = c - '0' - 1;
                    rows[i][index]++;
                    columns[j][index]++;
                    subboxes[i / 3][j / 3][index]++;
                    if (rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1089328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GEE:基于GLDAS数据集分析土壤湿度的时间序列变化

作者:CSDN @ _养乐多_ 本篇博客将介绍如何使用Google Earth Engine(GEE)进行土壤湿度数据的分析。我们将使用NASA GLDAS(Global Land Data Assimilation System)数据集,其中包括了关于土壤湿度的信息。通过该数据集,我们将了解土壤湿度在特定区域和时间段内的变化,并生…

Excel 插入和提取超链接

构造超链接 HYPERLINK(D1,C1)提取超链接 Sheet页→右键→查看代码Sub link()Dim hl As HyperlinkFor Each hl In ActiveSheet.Hyperlinkshl.Range.Offset(0, 1).Value hl.AddressNext End Sub工具栏→运行→运行子过程→提取所有超链接地址参考&#xff1a; https://blog.cs…

虚拟现实VR技术在医疗行业的应用介绍

虚拟现实 (VR) 虽然经常与游戏联系在一起&#xff0c;但不可否认&#xff0c;未来科技少不了虚拟现实&#xff0c;其应用可以彻底改变许多行业。在医疗领域&#xff0c;无数人正在探索 VR 可以帮助患者和医疗从业者实现更好的治疗结果治疗方式&#xff0c;比如在手术、疼痛管理…

《UnityShader入门精要》学习3

笛卡尔坐标系&#xff08;Cartesian Coordinate System&#xff09; 二维笛卡儿坐标系 一个二维的笛卡儿坐标系包含了两个部分的信息&#xff1a; 一个特殊的位置&#xff0c;即原点&#xff0c;它是整个坐标系的中心。两条过原点的互相垂直的矢量&#xff0c;即x轴和y轴。这…

网工内推 | 运维专场,厂商、软考证书优先,五险一金,节日福利

01 中安网脉 招聘岗位&#xff1a;运维工程师 职责描述&#xff1a; 1、负责驻场单位内网日常运维工作&#xff1b; 2、负责驻场单位网络设备、安全设备、服务器、存储设备、主机等的日常运维工作&#xff0c;按照运维流程要求进行日常运维、巡检、故障处理等运维服务工作。 3…

论文导读|八月下旬Operations Research文章精选:定价问题专题

编者按&#xff1a; ​ ​在“ Operations Research论文精选”中&#xff0c;我们有主题、有针对性地选择了Operations Research中一些有趣的文章&#xff0c;不仅对文章的内容进行了概括与点评&#xff0c;而且也对文章的结构进行了梳理&#xff0c;旨在激发广大读者的阅读兴…

C++编程基础|多级指针

C编程基础|多级指针 一级指针二级指针三级指针多级指针的意义一维数组与数组指针二维数组与数组指针 在看代码时发现下面的内容 GridNodePtr *** GridNodeMap;struct GridNode; typedef GridNode* GridNodePtr;显而GridNodePtr是结构体GridNode首地址指针 那么GridNodeMap是什…

centos离线安装telnet、traceroute工具

安装包下载地址 安装包下载地址在这里 直接输入包名&#xff0c;筛选系统&#xff0c;根据自己系统版本确定该下哪个包 centos离线安装telnet 准备三个安装包 xinetd-2.3.15-14.el7.x86_64.rpmtelnet-server-0.17-65.el7_8.x86_64.rpmtelnet-0.17-65.el7_8.x86_64.rpm 三个…

线性代数中涉及到的matlab命令-第二章:矩阵及其运算

目录 1&#xff0c;矩阵定义 2&#xff0c;矩阵的运算 3&#xff0c;方阵的行列式和伴随矩阵 4&#xff0c;矩阵的逆 5&#xff0c;克莱默法则 6&#xff0c;矩阵分块 1&#xff0c;矩阵定义 矩阵与行列式的区别&#xff1a; &#xff08;1&#xff09;形式上行列式…

贴片电容材质的区别与电容的主要作用

一、贴片电容材质NPO、COG、X7R、X5R、Y5V、Z5U区别 主要是介质材料不同&#xff0c;不同介质种类由于它的主要极化类型不一样&#xff0c;其对电场变化的响应速度和极化率也不一样。在相同的体积下的容量就不同&#xff0c;随之带来的电容器介质的损耗、容量的稳定性也就不同…

Vue2知识总结

vue2复习回顾 vue基础 想让vue工作&#xff0c;就必须创建一个vue实例&#xff0c;并且传入一个配置对象 【el data 】 <!-- 准备好一个容器 --><div id"demo"><h1>Hello&#xff0c;{{name.toUpperCase()}}&#xff0c;{{address}}</h1>…

天猫商品品牌数据采集接口,天猫商品详情数据接口,天猫API接口

天猫商品品牌数据采集方法如下&#xff1a; 打开天猫&#xff0c;进入任意一个品牌的商品页面。点击浏览器右上角的“选项”按钮&#xff0c;选择“检查元素”或使用快捷键CtrlShiftI&#xff08;Windows&#xff09;或CmdOptionI&#xff08;Mac&#xff09;打开开发者工具。…

Spring是什么?为什么要使用Spring?

目录 前言 一、Spring是什么&#xff1f; 1.1 轻量级 1.2 JavaEE的解决方案 二、为什么要使用Spring 2.1 传统方式完成业务逻辑 2.2 使用Spring模式完成业务逻辑 三、为什么使用Spring&#xff1f; 前言 本文主要介绍Spring是什么&#xff0c;并且解释为何要去使用Spring&…

【Python 零基础入门】 Numpy

【Python 零基础入门】第六课 Numpy 概述什么是 Numpy?Numpy 与 Python 数组的区别并发 vs 并行单线程 vs 多线程GILNumpy 在数据科学中的重要性 Numpy 安装Anaconda导包 ndarraynp.array 创建数组属性np.zeros 创建np.ones 创建 数组的切片和索引基本索引切片操作数组运算 常…

TypeScript React(上)

目录 扩展学习资料 TypeScript设计原则 TypeScript基础 语法基础 变量声明 JavaScript声明变量 TypeScript声明变量 示例 接口 (标准类型-Interface) 类型别名-Type 接口 VS 类型别名 类型断言:欺骗TS&#xff0c;肯定数据符合结构 泛型、<大写字母> 扩展学习…

Vulnhub系列靶机---Raven2

文章目录 Raven2 渗透测试信息收集提权UDF脚本MySQL提权SUID提权 Raven2 渗透测试 信息收集 查看存活主机 arp-scan -l 找到目标主机。 扫描目标主机上的端口、状态、服务类型、版本信息 nmap -A 192.168.160.47目标开放了 22、80、111 端口 访问一下80端口&#xff0c;并…

VSCode 快速移动光标至行尾

最近在用vscode进行C编程&#xff0c;经常需要把光标跳到行尾去添加符号。 手动到行尾太麻烦了。 一种快捷方式是&#xff1a;用键盘上的“END”快捷键。 但是用这个键也不是很方便&#xff0c;因为“end”键离主键盘区太远。 另一种便捷的方式是&#xff1a;给vscode设置自定义…

分权分域有啥内容?

目前的系统有什么问题&#xff1f; 现在我们的系统越来越庞大&#xff0c;可是每一个人进来的查看到的内容完全一样&#xff0c;没有办法灵活的根据不同用户展示不同的数据 例如我们有一个系统&#xff0c;期望不同权限的用户可以看到不同类型的页面&#xff0c;同一个页面不…

计算机毕业设计选什么题目好?springboot 高校就业管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

供应链 | 零售商-供应商柔性承诺契约:一种鲁棒优化方法 (一)

论文解读&#xff1a;毕鑫宇 作者&#xff1a;Aharon Ben-Tal, Boaz Golany, Arkadi Nemirovski, Jean-Philippe Vial 引用&#xff1a;Ben-Tal, A., Golany, B. , Nemirovski, A., & Vial, J. P… (2005). Retailer-supplier flexible commitments contracts: a robust op…