【LeetCode面试150】——36有效的数独

news2024/9/20 18:38:55

博客昵称:沈小农学编程

作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟!

PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘

题目难度:中等

默认优化目标:最小化时间复杂度。

Python默认为Python3。

目录

1 题目描述

2 题目解析

3 算法原理及代码实现

3.1 哈希表一次遍历

参考文献


1 题目描述

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

2 题目解析

输入是一个二维矩阵board,输出是布尔值。当满足约束条件,输出true,反之false。约束条件为:①数字1-9在每一行只能出现一次;②数字1-9在每一列只能出现一次;③数字1-9在每一个以粗实线分隔的3×3宫内只能出现一次。

 

3 算法原理及代码实现

3.1 哈希表一次遍历

三个约束条件都提到“只能出现一次”,我们可以使用哈希表来完成一次遍历。

对于数独的第i行第j列单元格,该单元格所在的九宫格行数和列数分别为\lfloor \frac{i}{3} \rfloor\lfloor \frac{j}{3} \rfloor ​。

 

时间复杂度O(1),空间复杂度O(1)。

C++代码实现

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;
    }
};

Python代码实现

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        rows = [[0] * 9 for _ in range(9)]
        columns = [[0] * 9 for _ in range(9)]
        subboxes = [[[0] * 9 for _ in range(3)] for _ in range(3)]
        
        for i in range(9):
            for j in range(9):
                c = board[i][j]
                if c != '.':
                    index = int(c) - 1
                    rows[i][index] += 1
                    columns[j][index] += 1
                    subboxes[i // 3][j // 3][index] += 1
                    if rows[i][index] > 1 or columns[j][index] > 1 or subboxes[i // 3][j // 3][index] > 1:
                        return False
        return True

参考文献

力扣面试经典150题

力扣官方题解

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

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

相关文章

微服务基础与Spring Cloud框架

一、系统架构的演变 1.1单体应⽤架构 Web应⽤程序发展的早期&#xff0c;⼤部分web⼯程(包含前端⻚⾯,web层代码,service层代码,dao层代码)是将 所 有的功能模块,打包到⼀起并放在⼀个web容器中运⾏。 1.2 垂直应⽤架构 当访问量逐渐增⼤&#xff0c;单⼀应⽤增加机器带来的…

【Unity3D小技巧】Unity3D中实现FPS数值显示功能实现

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 很简单也很使用的小技巧&#xff0c;就是在Unity…

PHP酒店宾馆民宿预订系统小程序源码

酒店宾馆民宿预订系统&#xff1a;一键解锁完美旅行住宿新体验 &#x1f31f; 开篇&#xff1a;告别繁琐&#xff0c;拥抱便捷预订新时代 在这个快节奏的时代&#xff0c;每一次旅行的规划都希望能尽可能高效与省心。想象一下&#xff0c;在规划一场说走就走的旅行时&#xf…

Nature | 小麦D基因组的起源和演化,野生近缘种对作物抗病改良具有重要潜力

image-20240815151428804 2024年8月14日沙特阿卜杜拉国王科技大学Brande B. H. Wulff 和 Simon G. Krattinger团队在Natue发表Origin and evolution of the bread wheat D genome研究论文&#xff0c;通过研究粗山羊草&#xff08;Aegilops tauschii&#xff0c;也被称为节节麦…

Ant-Design-Vue快速上手指南+排坑,操作详细步骤

Ant-Design-Vue是一款基于Vue.js的UI组件库&#xff0c;它不仅提供了丰富的高质量组件&#xff0c;还支持灵活的配置选项&#xff0c;使得开发者能够快速构建出既美观又功能强大的前端应用。下面将详细介绍Ant-Design-Vue的快速上手指南和排坑操作&#xff0c;帮助开发者顺利使…

Springboot整合mongodb和mysql两个数据库,mysql无法连接

一、问题 在日常开发中&#xff0c;难免需要用到mongodb和mysql数据库 当我在mongodb正常连接使用的时候&#xff0c;切换回mysql&#xff0c;发现无法连接 二、原因分析 1、端口查看被占用 winr打开命令提示符&#xff08;cmd&#xff09;&#xff0c;可以使用以下命令&…

html标签大合集一文入门

一、文档结构标签 <html>&#xff1a;网页的根标签 &#xff0c;嵌套包含所有标签。 <head>&#xff1a;头标签&#xff0c;包含文档的元数据用于编写网页的修饰内容&#xff0c;附加信息。 <body>&#xff1a;身体标签&#xff0c;用于编写展示内容&…

HTML5休闲小游戏《城市争夺战》源码,引流、刷广告利器

HTML5休闲小游戏《城市争夺战》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods468820.html

TCP Analysis Flags 之 TCP ACKed unseen segment

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

Java---面向对象

一.面向对象 1.概念 1.1面向过程 C 吃饭&#xff1a;动作为核心 起身--》开门--》大量的逻辑判断 1.2面向对象 C/Java/Python/Go 目标&#xff1a;吃饭 人&#xff08;忽略&#xff09;吃饭 站在人类的角度思考问题 2.什么是对象&#xff1f; Object-->东西(万事万物皆…

【数据结构2】哈希表、哈希表的应用(集合与字典、md5算法和文件的哈希值)

1 哈希表 哈希表一个通过哈希函数来计算数据存 储位置的数据结构&#xff0c;通常支持如下操作: 插入(键&#xff0c;值):插入键值对(键&#xff0c;值) Get(key):如果存在键为键的键值对则返回其值&#xff0c;否则返回空值 删除(键):删除键为键的键值对哈希表(Hash Table&am…

开发者学习类网站

目录 **1、CodeProject****2、simplilearn****3、VisuAlgo****4、Google AI****5、CodeWars****6、SourceForge****7、GeeksforGeeks****8、StackOverflow** 1、CodeProject 网址&#xff1a;https://www.codeproject.com/ CodeProject是一个免费公开自己写的代码与程序的优秀…

稀土阻燃协效剂在木质地板中的应用

木质地板作为一种天然材料&#xff0c;非常容易燃烧&#xff0c;因此需要采取措施来增强其阻燃性能。稀土阻燃协效剂基于稀土4f电子层结构带来的特有属性&#xff0c;在聚合物材料燃烧时可催化酯化成炭,迅速在高分子表面形成致密连续的碳层,隔绝聚合物材料内部的可燃性气体与氧…

vue项目png图片加载不出来的问题

前提&#xff1a;因为命名的时候 配合后端&#xff0c;所以把图片的名称设置成中文的例如&#xff1a;新增圆、新增方块等命名&#xff1b;提交到线上环境后&#xff0c;发现有些图片不能完全显示&#xff1b;鼠标移入查看地址&#xff0c;发现其他展示的图片已经转为base64的形…

SALib | 灵敏度分析Python工具箱

灵敏度分析Python工具箱 Sensitivity Analysis LibrarySupported MethodsInstallationRequirementsHow to cite SALibReference Sensitivity Analysis Library SALib是常用灵敏度分析方法的Python实现&#xff0c;包括 Sobol、Morris 和 FAST 方法。在系统建模中很有用&#x…

解决Element-plus中Carousel(走马灯)图片无法正常加载的bug

前言&#xff1a; 最近帮助朋友解决了一个使用Element-plus中Carousel&#xff08;走马灯&#xff09;图片无法正常加载的bug&#xff0c;经过笔者的不断努力终于实现了&#xff0c;现在跟大家分享一下&#xff1a; 朋友原来的代码是这样的&#xff1a; <template><…

代码随想录Day 23|回溯Part02,39.组合总和、40.组合总和Ⅱ、131.分割回文串

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 第七章 回溯算法part03一、题目题目一&#xff1a; 39. 组合总和解题思路&#xff1a;回溯三部曲剪枝优化小结&#xff1a; 题目二&#xff1a;40.组合总和Ⅱ解题思路&#xff1a;回溯三部曲 题目…

LabVIEW中CANopen Read SDO.vi 和 CANopen Read Write CAN Frame.vi区别

CANopen Read SDO.vi 和 CANopen Read Write CAN Frame.vi 都是 NI-Industrial Communications for CANopen 库中的示例 VI&#xff0c;用于与 CANopen 网络进行通信&#xff0c;但它们的功能和使用场景有所不同。以下是它们的主要区别&#xff1a; 1. 功能层次 CANopen Read W…

图像分割论文阅读:BCU-Net: Bridging ConvNeXt and U-Net for medical image segmentation

本文提出了一种集合ConvNeXt和U-Net优势的网络模型来分割医学图像。 当然&#xff0c;模型整体结构就是并列双分支&#xff0c;如果只是这些内容&#xff0c;不值得拿出来讲。 主要有意思的部分是其融合两分支的多标签召回模块&#xff08;multilabel recall loss module&…

Tutorial:Deep Learning for Remote Sensing Data

文章目录 0. Intro1. ADVANTAGES OF REMOTE SENSING METHODS2. THE GENERAL FRAMEWORK3. BASIC ALGORITHMS IN DEEP LEARNING3.1 CONVOLUTIONAL NEURAL NETWORKS3.1.1 CONVOLUTIONAL LAYER3.1.2 NONLINEARITY LAYER3.1.3 POOLING LAYER 3.2 AUTOENCODERS3.3 RESTRICTED BOLTZMA…