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

LeetCode 36. 有效的数独

有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

一次遍历法

有效数独的三个条件:
1.同一个数字在每一行只能出现一次;
2.同一个数字在每一列只能出现一次;
3.同一个数字在每一个小九宫格只能出现一次。

去重类问题,我们想到了哈希表的使用,如何结合起来呢?
我们首先考虑行数据,每行有个哈希表,记录了该行中数字出现的频率,数据可组织为:rows = [[key:val]],
由于数独中的数字范围是1到9,因此可以使用数组代替哈希表进行计数,数据可组织为:rows = [[Int]],减少复杂度。
同理,列数据可得

那么小九宫有何规律呢?
仔细观察发现,9x9 分块后变成了3x3,那么小九宫格的索引自然就是 i/3, j/3,此处记录数据的数组容量仍然为9
数据用三维数组形式表示为:subboxes = [[[Int]]]

复杂度分析
时间复杂度:O(1),注意,由于遍历了9x9 = 81次,常量级别的,因此时间复杂度为O(1)
空间复杂度:O(1),占用了常量空间用来记录变量

Swift

func isValidSudoku(_ board: [[Character]]) -> Bool {var rows:[[Int]] = Array(repeating: Array(repeating: 0, count: 9), count: 9)var columns = Array(repeating: Array(repeating: 0, count: 9), count: 9)var subboxes = Array(repeating: Array(repeating: Array(repeating: 0, count: 9), count: 3), count: 3)for i in 0..<9 {for j in 0..<9 {let c = board[i][j]if c != "." {let index:Int = c.wholeNumberValue! - 1rows[i][index] += 1columns[j][index] += 1subboxes[i/3][j/3][index] += 1;if rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i/3][j/3][index] > 1 {return false}}}}return true}

OC

- (BOOL)isValidSudoku:(NSArray *)board {NSMutableArray *rows = [NSMutableArray arrayWithCapacity:9];for (NSInteger i=0; i<9; i++) {NSMutableArray *itemArr = [NSMutableArray array];for (NSInteger j=0; j<9; j++) {[itemArr addObject:@(0)];}[rows addObject:itemArr];}NSMutableArray *columns = [NSMutableArray arrayWithCapacity:9];for (NSInteger i=0; i<9; i++) {NSMutableArray *itemArr = [NSMutableArray array];for (NSInteger j=0; j<9; j++) {[itemArr addObject:@(0)];}[columns addObject:itemArr];}NSMutableArray *subbox = [NSMutableArray arrayWithCapacity:3];for (NSInteger i=0; i<3; i++) {NSMutableArray *itemArr = [NSMutableArray array];for (NSInteger j=0; j<3; j++) {NSMutableArray *subItemArr = [NSMutableArray array];for (NSInteger k=0; k<9; k++) {[subItemArr addObject:@(0)];}[itemArr addObject:subItemArr];}[subbox addObject:itemArr];}for (NSInteger i=0; i<9; i++) {for (NSInteger j=0; j<9; j++) {NSString *c = board[i][j];if (![c isEqualToString:@"."]) {NSInteger idx = [c integerValue];rows[i][idx] = @([rows[i][idx] integerValue] + 1);columns[j][idx] = @([columns[j][idx] integerValue] + 1);subbox[i/3][j/3][idx] = @([subbox[i/3][j/3][idx] integerValue] + 1);if ([rows[i][idx] integerValue] > 1 || [columns[j][idx] integerValue] > 1 ||[subbox[i/3][j/3][idx] integerValue] > 1) {return NO;}}}}return YES;
}

OC 代码又臭又长,大家有没有好的优化建议呢?

相关文章:

  • Docker的基本管理
  • sklearn快速实现python机器学习算法
  • Java后端开发——Mybatis实验
  • idea使用docker-compose发布应用程序
  • 开机自启动android app
  • 嵌入式-Stm32-江科大基于寄存器点亮LED灯
  • docker 批量更改镜像标签
  • Quartus 软件界面介绍与部分使用技巧
  • 【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
  • 【迅搜17】SCWS分词(二)自定义字典及分词器
  • 【Matlab】加载路径下所有指定文件
  • go中常见的错误-以及泛型
  • DeepFloyd IF:由文本生成图像的强大模型,能够绘制文字的 AI 图像工具
  • 9.5.1 函数模板特化
  • 使用Android Compose实现网格列表滑到底部的提示信息展示
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • echarts花样作死的坑
  • ECS应用管理最佳实践
  • Java深入 - 深入理解Java集合
  • LeetCode29.两数相除 JavaScript
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • MD5加密原理解析及OC版原理实现
  • Python利用正则抓取网页内容保存到本地
  • 百度地图API标注+时间轴组件
  • 编写符合Python风格的对象
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 经典排序算法及其 Java 实现
  • 聊一聊前端的监控
  • 浅谈web中前端模板引擎的使用
  • 使用common-codec进行md5加密
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 用mpvue开发微信小程序
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #etcd#安装时出错
  • #NOIP 2014# day.2 T2 寻找道路
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (31)对象的克隆
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (pojstep1.3.1)1017(构造法模拟)
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (四)鸿鹄云架构一服务注册中心
  • (算法)N皇后问题
  • (一)Linux+Windows下安装ffmpeg
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .FileZilla的使用和主动模式被动模式介绍
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net 获取url的方法