Leetcode 每日一题 36.有效的数独

目录

问题描述

输入输出格式

算法思路

过题图片

代码实现

题目链接

复杂度分析


问题描述

给定一个 9x9 的数独棋盘,我们需要判断棋盘上已填入的数字是否有效。根据数独的规则,有效性需要满足以下条件:

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
  4. 空白格用 '.' 表示。

输入输出格式

输入:一个 9x9 的二维数组 board,其中每个元素是一个字符,表示数独棋盘上的数字或空白。

输出:一个布尔值,如果数独有效返回 true,否则返回 false

算法思路

为了判断数独的有效性,我们需要检查每一行、每一列以及每一个 3x3 宫格中的数字是否重复。我们可以使用三个数据结构来分别跟踪这些位置的数字出现次数:

  1. :使用一个数组 rows,其中每个元素是一个 HashMap,用于存储每一行中数字的出现次数。
  2. :使用一个数组 cols,与 rows 类似,用于存储每一列中数字的出现次数。
  3. 3x3 宫格:使用一个二维数组 cubes,其中每个元素是一个 HashMap,用于存储每个 3x3 宫格中数字的出现次数。

遍历整个棋盘,对于每个非空白的单元格,我们检查其对应的行、列和宫格中该数字是否已经出现过。如果出现过,则数独无效;否则,我们更新对应的计数器。

过题图片

代码实现

 

java

class Solution {
    public boolean isValidSudoku(char[][] board) {
        // 用于检查每一行
        Map<Character, Integer>[] rows = new HashMap[9];
        for (int i = 0; i < 9; i++) {
            rows[i] = new HashMap<>();
        }

        // 用于检查每一列
        Map<Character, Integer>[] cols = new HashMap[9];
        for (int i = 0; i < 9; i++) {
            cols[i] = new HashMap<>();
        }

        // 用于检查每一个3x3宫格
        Map<Character, Integer>[][] cubes = new HashMap[3][3];
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                cubes[i][j] = new HashMap<>();
            }
        }

        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                char c = board[i][j];
                if (c == '.') continue;

                // 检查行
                if (rows[i].getOrDefault(c, 0) > 0) return false;
                rows[i].put(c, rows[i].getOrDefault(c, 0) + 1);

                // 检查列
                if (cols[j].getOrDefault(c, 0) > 0) return false;
                cols[j].put(c, cols[j].getOrDefault(c, 0) + 1);

                // 检查3x3宫格
                int cubeIndexI = i / 3;
                int cubeIndexJ = j / 3;
                if (cubes[cubeIndexI][cubeIndexJ].getOrDefault(c, 0) > 0) return false;
                cubes[cubeIndexI][cubeIndexJ].put(c, cubes[cubeIndexI][cubeIndexJ].getOrDefault(c, 0) + 1);
            }
        }

        return true;
    }
}

题目链接

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

复杂度分析

  • 时间复杂度:O(1),因为棋盘的大小是固定的,我们只需要遍历一次棋盘。
  • 空间复杂度:O(1),虽然我们使用了额外的数据结构来存储计数器,但这些数据结构的大小与棋盘大小无关,因此空间复杂度是常数级别的。

矩阵题目

矩阵算法题是一类常见的编程问题,它们通常涉及到对二维数组的操作和处理。这类题目不仅考验对基本算法和数据结构的理解,还考验空间思维能力和问题抽象能力,我们需要以下能力。

1. 理解问题

首先,你需要彻底理解题目的要求。对于数独问题,我们需要知道数独的规则以及如何判断一个数独是否有效。仔细阅读题目描述,理解输入输出的格式,以及需要满足的条件。

2. 抽象问题

将实际问题抽象成数学模型。对于矩阵问题,通常涉及到行、列和子矩阵(如数独的3x3宫格)的操作。确定你需要跟踪哪些信息,以及如何表示这些信息。

3. 选择合适的数据结构

根据问题的特点选择合适的数据结构。对于跟踪每个行、列和宫格中的数字出现次数,HashMap(或类似的字典结构)是一个自然的选择,因为它可以快速地进行查找和更新操作。

4. 遍历矩阵

大多数矩阵问题都需要遍历整个矩阵。在遍历过程中,根据当前元素的位置更新你的数据结构。对于数独问题,我们需要检查每个非'.'字符是否违反了数独的规则。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出UART驱动开发与调试:从基础调试到虚拟驱动实现

往期内容 本专栏往期内容&#xff1a;Uart子系统 UART串口硬件介绍深入理解TTY体系&#xff1a;设备节点与驱动程序框架详解Linux串口应用编程&#xff1a;从UART到GPS模块及字符设备驱动 解UART 子系统&#xff1a;Linux Kernel 4.9.88 中的核心结构体与设计详解IMX 平台UART驱…

韦东山stm32hal库--定时器喂狗模型按键消抖原理+实操详细步骤

一.定时器按键消抖的原理: 按键消抖的原因: 当我们按下按键的后, 端口从高电平变成低电平, 理想的情况是, 按下, 只发生一次中断, 中断程序只记录一个数据. 但是我们使用的是金属弹片, 实际的情况就是如上图所示, 可能会发生多次中断,难道我们要记录3/4次数据吗? 答:按键按下…

Web前端学习_CSS盒子模型

content padding border margin <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS盒子模型</title><style></style> </head> <body> <div class"demo&quo…

将自定义 AWS S3 快照存储库连接到 Elastic Cloud

作者&#xff1a;来自 Elastic Annie Hansen, Stef Nestor 在本博客中&#xff0c;我们将介绍如何通过 Elasticsearch 的快照将我们已提交的集群数据备份到 AWS S3 存储桶中。在 Elastic Cloud&#xff08;企业版&#xff09;中&#xff0c;Elastic 在其 found-snapshots 存储…

部署 Prometheus

实验环境 IP地址服务192.168.88.10Prometheus服务端, Consul, Grafana, Node-Exporter192.168.88.77MySQL, Node-Exporter192.168.88.30Nginx&#xff0c;Node-Exporter 一、Prometheus Server 端安装和相关配置 【Prometheus1.sh】 &#xff08;1&#xff09;上传 prometh…

第29天 MCU入门

目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明&#xff1a; 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…

汽车免拆诊断案例 | 2017款捷豹F-PACE车发动机偶尔怠速不稳

故障现象  一辆2017款捷豹F-PACE车&#xff0c;搭载2.0 L GTDi发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;车辆组合仪表上发动机故障灯点亮&#xff08;图1&#xff09;&#xff0c;且发动机偶尔怠速不稳。 图1 发动机故障灯点亮 故障诊断 接车后试车…

Cobalt Strike 4.8 用户指南-第十一节 C2扩展

11.1、概述 Beacon 的 HTTP 指标由 Malleable Command and Control &#xff08;Malleable C2&#xff09; 配置文件控制。Malleable C2 配置文件是一个简单的程序&#xff0c;它指定如何转换数据并将其存储在事务中。转换和存储数据的同一程序&#xff08;向后解释&#xff0…

上传镜像docker hub登不上和docker desktop的etx4.vhdx占用空间很大等解决办法

平时使用docker一般都在Linux服务器上&#xff0c;但这次需要将镜像上传到docker hub上&#xff0c;但是服务器上一直无法登录本人的账号&#xff0c;&#xff08;这里的问题应该docker 网络配置中没有开代理的问题&#xff0c;因服务器上有其他用户使用&#xff0c;不可能直接…

[BUUCTF]ciscn_2019_n_8

题目 解题 先连接看看有什么信息 返回whats your name 没有其他信息 看程序基本信息 32位 拉到ida32查看 打开发现如下 由上述代码可知&#xff0c;需要将数组0-12装满&#xff0c;装什么都可以&#xff0c;将var[13]17才能执行system("/bin/sh") payload fro…

orangepi _全志H616

1. 全志H616简介 1.1. 为什么学&#xff1a; 学习目标依然是Linux系统&#xff0c;平台是ARM架构 蜂巢快递柜&#xff0c;配送机器人&#xff0c;这些应用场景用C51,STM32单片机无法实现 &#xff08;UI界面&#xff0c;提高用户的体验感&#xff09;第三方介入库的局限性&a…

信息收集之网站架构类型和目录扫描(一)

目录 前言 1.查看域名的基本信息 2.常见的网站架构类型 3.目录扫描 前言 最近也是到了期末周了,比较空闲,把信息收集的一些方式和思路简单总结一下,顺便学习一些新的工具和一些未接触到的知识面. 1.查看域名的基本信息 新学了一个工具,kali中的whois也可以进行查看,当然在…

消息中间件用途介绍

1. 解耦&#xff08;Decoupling&#xff09;&#xff1a; • 消息中间件能够将消息的生产者&#xff08;Producer&#xff09;和消费者&#xff08;Consumer&#xff09;分离开来&#xff0c;使它们不必直接相互依赖。这种设计降低了系统的耦合度&#xff0c;提升了系统的可扩展…

【Maven】Nexus私服

6. Maven的私服 6.1 什么是私服 Maven 私服是一种特殊的远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远程仓库&#xff08;中央仓库、其他远程公共仓库&#xff09;。一些无法从外部仓库下载到的构件&#xff0c;如项目组其他人员开发的…

学习ASP.NET Core的身份认证(基于Cookie的身份认证3)

用户通过验证后调用HttpContext.SignInAsync函数将用户的身份信息保存在认证Cookie中,以便后续的请求可以验证用户的身份,该函数原型如下所示&#xff0c;其中properties参数的主要属性已在前篇文章中学习&#xff0c;本文学习scheme和principal的意义及用法。 public static …

【mac】终端左边太长处理,自定义显示名称(terminal路径显示特别长)

1、打开终端 2、步骤 &#xff08;1&#xff09;修改~/.zshrc文件 nano ~/.zshrc&#xff08;2&#xff09;添加或修改PS1&#xff0c;我是自定义了名字为“macminiPro” export PS1"macminiPro$ "&#xff08;3&#xff09;使用 nano: Ctrl o &#xff08;字母…

uniapp关闭sourceMap的生成,提高编译、生产打包速度

警告信息&#xff1a;[警告⚠] packageF\components\mpvue-echarts\echarts.min.js 文件体积超过 500KB&#xff0c;已跳过压缩以及 ES6 转 ES5 的处理&#xff0c;手机端使用过大的js库影响性能。 遇到问题&#xff1a;由于微信小程序引入了mpvue-echarts\echarts.min.js&…

PyTorch 模型转换为 ONNX 格式

PyTorch 模型转换为 ONNX 格式 在深度学习领域&#xff0c;模型的可移植性和可解释性是非常重要的。本文将介绍如何使用 PyTorch 训练一个简单的卷积神经网络&#xff08;CNN&#xff09;来分类 MNIST 数据集&#xff0c;并将训练好的模型转换为 ONNX 格式。我们还将讨论 PTH …

Three.js 和其他 WebGL 库 对比

在WebGL开发中&#xff0c;Three.js是一个非常流行的库&#xff0c;它简化了3D图形的创建和渲染过程。然而&#xff0c;市场上还有许多其他的WebGL库&#xff0c;如 Babylon.js、PlayCanvas、PIXI.js 和 Cesium&#xff0c;它们也有各自的特点和优势。本文将对Three.js 与这些常…

通过 JNI 实现 Java 与 Rust 的 Channel 消息传递

做纯粹的自己。“你要搞清楚自己人生的剧本——不是父母的续集&#xff0c;不是子女的前传&#xff0c;更不是朋友的外篇。对待生命你不妨再大胆一点&#xff0c;因为你好歹要失去它。如果这世上真有奇迹&#xff0c;那只是努力的另一个名字”。 一、crossbeam_channel 参考 cr…