每日一题:有效的数独

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

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

注意:

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

示例 :

输入: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

位运算

由于数独是9x9的方格,这里总共需要判断9行、9列、9个3x3方格中的数是否有重复。

创建三个位掩码数组:rowcolblock,每个数组有 9 个元素,用于跟踪每个行、列和块中出现的数字。

以例子中第一行为例,初始状态row[0] = 0,二进制表示为0b0000000000。

当遍历board[i,j]时,需要对row[i],col[j],block[i/3*3 + j/3]进行更新。

注意这里的block[i/3*3 + j/3],为什么是下标是i/3*3 + j/3

首先注意这里的除法都是整除向下取整,因此下标0,1,2经过除法后为0,下标3,4,5经过除法后为1,按照上图对3x3网格进行分块:

  • [012,012] -> 块0
  • [012,345] -> 块1
  • [012,678] -> 块2
  • [345,012] -> 块3
  • ......

回到例子中,第一步遍历board[0][0] = 5,那么代码执行row[0] = 0b0000000000 | (1 << 5),即0b0000010000。

对81个方格重复这个位运算的过程。

在这个遍历的过程中进行判断,如果计算之前这位就是1了,说明在这一行/列/块中已经出现过对应数字,直接返回无效。

class Solution {public boolean isValidSudoku(char[][] board) {int[] row = new int[9];int[] col = new int[9];int[] block = new int[9];for(int i = 0;i < 9;i++){for(int j = 0;j < 9;j++){if(board[i][j] == '.'){continue;}int num = board[i][j] - '0';int block_num = i / 3 * 3 + j / 3;if(((row[i] >> num) & 1) == 1 || ((col[j] >> num) & 1) == 1|| ((block[block_num] >> num) & 1) == 1){return false;}row[i] = row[i] | (1 << num);col[j] = col[j] | (1 << num);block[block_num] = block[block_num] | (1 << num);}}return true;}
}

 算法概述:

  1. 创建三个位掩码数组:rowcolblock,每个数组有 9 个元素,用于跟踪每个行、列和块中出现的数字。
  2. 遍历棋盘,对于每个非空单元格:
    • 计算单元格所在的块号 block_num
    • 如果数字在当前行、列或块中已经出现(即位掩码数组中相应位为 1),则返回 false。
    • 否则,将数字标记为在当前行、列和块中出现,即在相应位掩码数组中设置相应位为 1。
  3. 如果遍历完棋盘,返回 true。

除去位运算方式,还可以通过二维数组,哈希表对遍历结果进行存储,本质上都是遍历一次网格,记录是否出现重复元素,只有存储方式上的差别。

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

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

相关文章

git submodule---同步最新的内容

0 Preface/Foreword 1 同步最新submodule内容到repo中 项目的repo包含了一个子模块&#xff0c;在开发过程中&#xff0c;经常需要同步子模块最新的commit到repo中。该如何操作呢&#xff1f; 本地在克隆时候&#xff0c;已经同步把子模块中的内容克隆下来了&#xff0c;但是…

Python爬取淘宝商品评价信息API接口测试实例

item_review-获得淘宝商品评论 公共参数 请求地址: taobao/item_review 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,it…

4.5日学习打卡----学习Apache HttpClient 5

4.5日学习打卡 目录&#xff1a; 4.5日学习打卡Apache Commons HttpClient简介 Apache HttpClient 5简介依赖HttpClient 5 GET 请求HttpClient 5 Fluent GETHttpClient5 GET 请求参数HttpClient 5 POST 请求HttpClient 5 Fluent POSTHttpClient5 POST JSON 参数HttpClient 5 设…

Java中利用BitMap位图实现海量级数据去重

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 前言 什么是BitMap&#xff1f;有什么用&#xff1f; 基本概念 位图的优势 …

加快构建数字影像优势 成都文创产业园区持续发力

在数字化时代的浪潮下&#xff0c;成都文创产业园区以其前瞻性的视野和战略布局&#xff0c;正加快构建数字影像优势&#xff0c;成都文创产业园区持续发力&#xff0c;为城市的文化创意产业发展注入新动力。国际数字影像产业园作为其中的佼佼者&#xff0c;以其三大生态服务体…

GitHub 仓库 (repository) Watch - Star - Fork - Follow

GitHub 仓库 [repository] Watch - Star - Fork - Follow References 眼睛图标旁边写着 Watch 字样。点击这个按钮就可以 Watch 该仓库&#xff0c;今后该仓库的更新信息会显示在用户的公开活动中。Star 旁边的数字表示给这个仓库添加 Star 的人数。这个数越高&#xff0c;代表…

小白学Java成长日记特别篇

晚上好&#xff0c;各位小伙伴。今天给大家带来的是Java的输出补充篇&#xff0c;前两篇说了输出和输入的大概&#xff0c;但我没有详细讲它俩&#xff0c;因此这篇文章来详细的聊一聊它俩。那么废话不多说&#xff0c;我们赶紧进入正题。 首先讲一讲这个Java的输出吧。 输出格…

gocron定时任务管理

基于gocron定时任务建设 基础环境配置 golang安装 下载 wget https://dl.google.com/go/go1.21.6.linux-amd64.tar.gz export PATH$PATH:/usr/local/go/bin 下载gocron组件 wget https://github.com/ouqiang/gocron/releases/download/v1.5.3/gocron-v1.5.3-linux-amd64.tar.g…

SpringBoot集成Skywalking日志收集

在实际项目中&#xff0c;为了方便线上排查问题&#xff0c;尤其是微服务之间调用链路比较复杂的系统中&#xff0c;通过可视化日志的手段仍然是最直接也很方便的排查定位问题的手段&#xff0c;比如大家熟悉的ELK就是一种比较成熟的可视化日志展现方式&#xff0c;在skywalkin…

kamailio mysql数据表之subscriber用户表

1:表结构 CREATE TABLE subscriber (id int(10) unsigned NOT NULL AUTO_INCREMENT,username varchar(64) NOT NULL DEFAULT ,domain varchar(64) NOT NULL DEFAULT ,password varchar(64) NOT NULL DEFAULT ,ha1 varchar(128) NOT NULL DEFAULT ,ha1b varchar(128) NOT NULL …

书生·浦语大模型第二期实战营第二课笔记和基础作业

来源&#xff1a; 作业要求:Homework - Demo 文档教程:轻松玩转书生浦语大模型趣味 Demo B站教程:轻松玩转书生浦语大模型趣味 Demo 1. 笔记 2.基础作业 2.1 作业要求 2.2 算力平台 2.3 新建demo目录&#xff0c;以及新建目录下的文件&#xff0c;下载模型参数 2.4 Intern…

谷歌seo自然搜索排名怎么提升快?

要想在谷歌上排名快速上升&#xff0c;关键在于运用GPC爬虫池跟高低搭配的外链组合 首先你要做的&#xff0c;就是让谷歌的蜘蛛频繁来你的网站&#xff0c;网站需要被谷歌蜘蛛频繁抓取和索引&#xff0c;那这时候GPC爬虫池就能派上用场了&#xff0c;GPC爬虫池能够帮你大幅度提…

LangChain - Chain

文章目录 1、概览为什么我们需要链? 2、快速入门 (Get started) - Using LLMChain多个变量 使用字典输入在 LLMChain 中使用聊天模型&#xff1a; 3、异步 API4、不同的调用方法__call__调用仅返回输出键值 return_only_outputs只有一个输出键 run只有一个输入键 5、自定义cha…

DasViewer可以添加照片到里面吗?点开就可以看照片?

DasViewer主要是三维模型浏览器&#xff0c;二维可以添加矢量和正射影像&#xff0c;航片暂不支持。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便…

vue element动态添加删除数据div

Vue 动态添加 div|极客教程 Vue 点击后添加元素方法_vue追加新元素-CSDN博客 vueelement项目动态添加删除数据div_elementui动态添加div-CSDN博客 附: <template><div><el-button click"addDiv">添加Div</el-button><div v-for"…

蓝桥杯嵌入式(G431)备赛笔记——UART

printf的重定向 为了方便使用&#xff0c;通过keil中的Help功能的帮助&#xff0c;做一个printf的重定向 搜索fputc&#xff0c;复制这段 将复制的那段放入工程中&#xff0c;并添加串口发送的函数 关键代码 u8 rx_buff[30]; // 定义一个长度为30的接收缓冲区数组rx_buff u8…

leetcode2529--正整数和负整数的最大计数

1. 题意 给定有序数组&#xff0c;求其中正整数和负整数的计数最大值。 正整数和负整数的最大计数 2. 题解 2.1 遍历 直接判断 class Solution { public:int maximumCount(vector<int>& nums) {int neg 0;int pos 0;for (int num:nums) {if (!num)continue;i…

在 Python 编程中,面向对象编程的核心概念包括哪些部分?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在 Python 编程中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;的核心概念主要包括类&#xff08;Class&#xff09;、对象&#xff08;Object&#x…

“数字大冒险:探索二分查找的神奇之旅“

前言 作者&#xff1a;小蜗牛向前冲 专栏&#xff1a;小蜗牛算法之路 专栏介绍&#xff1a;"蜗牛之道&#xff0c;攀登大厂高峰&#xff0c;让我们携手学习算法。在这个专栏中&#xff0c;将涵盖动态规划、贪心算法、回溯等高阶技巧&#xff0c;不定期为你奉上基础数据结构…

深入了解Linux: dbus-daemon系统总线的作用与管理

dbus-daemon是Linux和其他类Unix系统中的消息总线系统&#xff0c;它允许不同的程序&#xff08;通常是进程&#xff09;进行相互通信。dbus-daemon提供了两种类型的消息总线&#xff0c;一种是系统总线&#xff08;system bus&#xff09;&#xff0c;另一种是会话总线&#x…