当前位置: 首页 > news >正文

36. 有效的数独 - 力扣(LeetCode)

基础知识要求:

Java:方法、for循环、if判断、数组

Python: 方法、for循环、if判断、列表、集合

题目: 

请你判断一个 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)或者 '.'

思路解析:

  1. 初始化检查器
    • 初始化三个二维数组或集合(rowscolsboxes),用于存储每行、每列和每个3x3宫中已经出现的数字。
  2. 遍历数独
    • 遍历数独的每一个格子(board[i][j])。
  3. 检查当前格子
    • 如果当前格子是空格(即值为.),则跳过该格子,继续检查下一个。
    • 如果当前格子有数字(1-9之间的数字),则进行以下检查:
  4. 检查行和列
    • 检查该数字是否已经在当前行(rows[i])中出现过。
    • 检查该数字是否已经在当前列(cols[j])中出现过。
    • 如果出现重复,则该数独无效,返回False
  5. 检查宫
    • 计算当前格子所在的宫的索引(可以通过(i // 3) * 3 + j // 3得到)。
    • 检查该数字是否已经在该宫(boxes[box_index])中出现过。
    • 如果出现重复,则该数独无效,返回False
  6. 记录数字
    • 如果上述检查都通过,将该数字添加到当前行、列和宫的集合中。
  7. 完成遍历
    • 如果遍历完整个数独都没有返回False,则说明该数独是有效的,返回True

这个思路的关键在于通过三个检查器(行、列、宫)来跟踪每个数字是否已经出现过,并在遍历过程中不断更新这些检查器。如果在任何时刻发现重复的数字,就立即返回False,否则在遍历结束后返回True

Java代码示例:

public class SudokuSolver {  public static boolean isValidSudoku(char[][] board) {  // 初始化行、列和宫的集合  boolean[][] rows = new boolean[9][9];  boolean[][] cols = new boolean[9][9];  boolean[][][] boxes = new boolean[3][3][9];  // 遍历数独的每一个格子  for (int i = 0; i < 9; i++) {  for (int j = 0; j < 9; j++) {  char num = board[i][j];  // 如果当前格子是空格,则跳过  if (num == '.') {  continue;  }  // 将字符数字转换为整数('1' -> 1, '2' -> 2, ..., '9' -> 9)  int numInt = num - '1';  // 计算当前格子所在的宫的索引  int boxRow = i / 3;  int boxCol = j / 3;  // 检查行中是否已有该数字  if (rows[i][numInt]) {  return false;  }  rows[i][numInt] = true;  // 检查列中是否已有该数字  if (cols[j][numInt]) {  return false;  }  cols[j][numInt] = true;  // 检查宫中是否已有该数字  if (boxes[boxRow][boxCol][numInt]) {  return false;  }  boxes[boxRow][boxCol][numInt] = true;  }  }  // 遍历完所有格子后,没有发现重复数字,数独有效  return true;  }  public static void main(String[] args) {  // 示例1  char[][] board1 = {  {'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'}  };  System.out.println(isValidSudoku(board1)); // 输出: true  // 示例2  char[][] board2 = {  {'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'}  };  System.out.println(isValidSudoku(board2)); // 输出: false  }  
}

Python代码示例:

def isValidSudoku(board):  # 初始化行、列和宫的数字集合  rows = [set() for _ in range(9)]  cols = [set() for _ in range(9)]  boxes = [set() for _ in range(9)]  # 遍历数独的每一个格子  for i in range(9):  for j in range(9):  num = board[i][j]  if num == '.':  continue  # 计算当前格子所在的宫的索引  box_index = (i // 3) * 3 + j // 3  # 尝试将数字num添加到行、列和宫的集合中  # 如果添加失败(即已经存在),则返回False  if num in rows[i] or num in cols[j] or num in boxes[box_index]:  return False  # 否则,添加成功,继续检查下一个格子  rows[i].add(num)  cols[j].add(num)  boxes[box_index].add(num)  # 所有格子检查完毕,没有发现重复数字,返回True  return True  # 示例测试  
board1 = [  ["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"]  
]  
print(isValidSudoku(board1))  # 输出: True  board2 = [  ["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"]  
]  
print(isValidSudoku(board2))  # 输出: False

相关文章:

36. 有效的数独 - 力扣(LeetCode)

基础知识要求&#xff1a; Java&#xff1a;方法、for循环、if判断、数组 Python&#xff1a; 方法、for循环、if判断、列表、集合 题目&#xff1a; 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一…...

开源收银系统在服装连锁店中发挥的重要作用

在当今竞争激烈的零售市场中&#xff0c;服装连锁店面临着日益复杂的经营环境和多样化的消费需求。在这样的背景下&#xff0c;开源收银系统成为了服装连锁店管理的关键利器。该系统不仅提供了高效的收银功能&#xff0c;还涵盖了进销存管理、会员管理、门店补货等多方面功能&a…...

代码随想录三刷day51

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣200. 岛屿数量二、力扣695. 岛屿的最大面积三、力扣1020. 飞地的数量四、力扣130. 被围绕的区域 前言 依然是从地图周边出发&#xff0c;将周边空格相邻…...

基于python+Django的二维码生成算法设计与实现

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

pytorch 2.0 多线程并行,导致GPU利用100%,卡住

背景&#xff1a; 程序中有pytorch模型两个&#xff0c;yolov5&#xff0c;crnn。 之前无论是pth格式&#xff0c;还是TRT格式&#xff0c;并行的都没有问题。 最近发现&#xff0c;多线程ThreadPoolExecutor(max_workers2)调用的时候&#xff0c;即单个进程内处理一张图像&a…...

后端开发面经系列 -- 阿里C++二面面经

阿里C二面面经 公众号&#xff1a;阿Q技术站 来源&#xff1a;https://www.nowcoder.com/feed/main/detail/fc4a48403b534aafa6a6bce14b542c4e?sourceSSRsearch 1、智能指针&#xff1f; std::shared_ptr&#xff1a; 原理&#xff1a;std::shared_ptr是基于引用计数的智能指…...

【Image captioning】In Defense of Grid Features for Visual Question Answering实现流程

In Defense of Grid Features for Visual Question Answering实现流程 网格特征预训练代码 这是该论文的特征预训练代码发布: @InProceedings{jiang2020defense,title={In Defense of Grid Features for Visual Question Answering},author={Jiang, Huaizu and Misra, Ishan…...

MySQL用SQL取三列中最大的数据值

1、有如下数据&#xff1a; ABC000097.0600330.72330.720069.650027.8827.85086.92086.92219.42219.4219.41 需要展示为如下形式&#xff1a; ABC结果列0000097.06097.060330.72330.72330.7200669.65009.6527.8827.85027.8886.92086.9286.92219.42219.4219.41219.42 解决办…...

【Mac】如何解决打开PD虚拟机后Mac无法上网的问题?

问题描述 部分用户在运行Parallels Desktop并打开Windows 11后&#xff0c;发现Windows上网没有问题&#xff0c;但是Mac主机不能访问带域名的网站&#xff0c;而访问带IP的网站没问题&#xff0c;退出Parallels虚拟机以后&#xff0c;Mac网络又恢复正常。 解决办法 退出 Pa…...

【NodeMCU实时天气时钟温湿度项目 7】和风天气API返回JSON数据信息的解压缩实现——ArduinoUZlib功能库

今天是第七专题&#xff0c;主要内容是&#xff1a;导入ArduinoUZlib功能库&#xff0c;借助该库把从【和风天气】官网返回的经过Gzip压缩的JSON数据&#xff0c;进行解压缩和t解析&#xff0c;在串口监视器上输出解析后的JSON信息。 如您需要了解其它专题的内容&#xff0c;请…...

leetcode题目9

回文数 简单 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数:是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 思路 对于数字进行反转&a…...

CNAME记录

CNAME记录 维基百科&#xff0c;自由的百科全书 &#xff08;重定向自CNAME&#xff09; 真实名称记录&#xff08;英语&#xff1a;Canonical Name Record&#xff09;&#xff0c;即CNAME记录&#xff0c;是域名系统&#xff08;DNS&#xff09;的一种记录。CNAME记录用于…...

pytest + yaml 框架 -69.新增depend 关键字,导入其它yaml用例

前言 有小伙伴提到&#xff0c;test_a.yml 中已经写了几个流程&#xff0c;test_b.yml 中希望能接着test_a.yml去写用例&#xff0c;于是就需要先导入test_a.yml用例。 为了满足此需求&#xff0c;v1.6.3版本 在config 中新增 depend 关键字。 需求场景 test_a.yml 中已经写…...

【网络】tcp的初始化序列号为什么要随机生成

TCP序列号和确认序列号 在TCP协议中&#xff0c;每个数据包都包含一个序列号和一个确认序列号&#xff0c;用于实现可靠的数据传输和流量控制。 序列号&#xff08;Sequence Number&#xff09;&#xff1a;序列号是发送端为每个发送的数据包分配的唯一标识&#xff0c;用于标…...

【SRC实战】利用APP前端加密构造数据包

挖个洞先 https://mp.weixin.qq.com/s/ZnaRn222xJU0MQxWoRaiJg “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合” 01 — 漏洞证明 “ 参数加密的情况&#xff0c;不会逆向怎么办&#xff1f;” 1、新用户首次设置密码时抓包&#xff0c;此处设置为0000…...

ThreadLocal描述

ThreadLocal是Java中的一个类&#xff0c;用于在多线程环境下存储和获取线程相关的数据。每个ThreadLocal对象都可以维护一个线程本地的变量副本&#xff0c;这意味着每个线程都可以独立地改变自己的副本&#xff0c;而不会影响其他线程的副本。这种特性使得ThreadLocal非常适合…...

Linux-基础命令第三天

1、命令&#xff1a;wc 作用&#xff1a;统计行数、单词数、字符数 格式&#xff1a;wc 选项 文件名 例&#xff1a; 统计文件中的行数、单词数、字符数 说明&#xff1a;59代表行数&#xff0c;111代表单词数&#xff0c;2713代表字符数&#xff0c;a.txt代表文件名 选项…...

Windows Server 2022 环境下WEB和DNS服务器配置方法

目录 实验名称&#xff1a;WEB和DNS服务器配置实验目的实验原理&#xff1a;主要设备、器材&#xff1a;实验内容&#xff1a;配置本地WEB站点配置本地DNS服务器 实验名称&#xff1a;WEB和DNS服务器配置 实验目的 掌握 Windows Server 2022 环境下WEB服务器配置方法 掌握 Wi…...

静态住宅代理 IP 的影响

在不断发展的在线业务和数字营销领域&#xff0c;保持领先地位势在必行。在业界掀起波澜的最新创新之一是静态住宅代理 IP 的利用。这些知识产权曾经是为精通技术的个人保留的利基工具&#xff0c;现在正在成为各行业企业的游戏规则改变者。 一、静态住宅代理IP到底是什么&…...

IP代理中的SOCKS5代理是什么?安全吗?

在互联网世界中&#xff0c;网络安全和个人隐私保护变得日益重要。SOCKS5代理作为一种安全高效的网络工具&#xff0c;不仅可以保护个人隐私安全&#xff0c;还可以提供更稳定、更快度的网络连接。本文将带大家深入了解SOCKS5代理在网络安全领域中的应用。 什么是SOCKS5代理 …...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...