1. 题目解析与核心思路1.1 题目要求拆解LeetCode 1886题要求我们判断两个n x n的矩阵是否可以通过90度倍数的旋转相互转换。具体来说给定原始矩阵mat和目标矩阵target我们需要确定是否存在一个旋转角度90、180或270度使得旋转后的mat与target完全一致。这个题目考察的核心能力包括二维数组的操作能力矩阵旋转的算法实现边界条件的处理空间复杂度的优化意识1.2 矩阵旋转的数学原理矩阵旋转90度本质上是一种线性变换。对于一个n x n矩阵顺时针旋转90度可以通过以下两个步骤实现转置矩阵行列互换反转每一行的元素顺序数学表达式为 旋转后的矩阵mat_rotated[i][j] mat[n-1-j][i]这个性质非常重要因为它提供了我们实现旋转操作的理论基础。理解这个原理后我们可以推导出180度和270度旋转的等效操作。1.3 解题思路选择面对这个问题我们有几种可能的解决路径暴力比较法直接生成所有可能的旋转结果最多3种然后逐一与target比较特征比较法比较矩阵的某些旋转不变特征如对角线元素原位旋转法通过原地操作实现旋转减少空间复杂度经过分析暴力比较法虽然时间复杂度较高O(n^2)但实现简单直观适合作为首选方案。特别是考虑到n的限制n 10这种方法完全可行。2. 算法实现与优化2.1 基础实现方案最直接的实现方式是编写一个旋转函数然后依次尝试90、180、270度旋转每次旋转后与目标矩阵比较def findRotation(mat, target): n len(mat) # 0度旋转直接比较 if mat target: return True # 尝试90、180、270度旋转 rotated [row[:] for row in mat] # 深拷贝 for _ in range(3): rotated rotate90(rotated) if rotated target: return True return False def rotate90(matrix): n len(matrix) # 转置矩阵 for i in range(n): for j in range(i, n): matrix[i][j], matrix[j][i] matrix[j][i], matrix[i][j] # 反转每行 for row in matrix: row.reverse() return matrix2.2 空间复杂度优化上面的实现每次旋转都创建了新矩阵空间复杂度为O(n^2)。我们可以优化为原地旋转def findRotation(mat, target): n len(mat) if mat target: return True for _ in range(3): # 原地旋转90度 for i in range(n): for j in range(i, n): mat[i][j], mat[j][i] mat[j][i], mat[i][j] for row in mat: row.reverse() if mat target: return True return False这种实现将空间复杂度降到了O(1)但需要注意这会修改原始矩阵。如果要求不修改原矩阵需要先做深拷贝。2.3 提前终止优化在旋转比较过程中一旦发现某个旋转角度匹配可以立即返回不需要继续尝试其他角度。这在大多数情况下可以节省时间。3. 边界条件与特殊情况处理3.1 空矩阵处理虽然题目保证n 1但良好的编程习惯应该处理边界情况if not mat or not target: return False if len(mat) ! len(target) or len(mat[0]) ! len(target[0]): return False3.2 单元素矩阵当n1时矩阵只有一个元素任何旋转都不会改变它if n 1: return mat[0][0] target[0][0]3.3 完全相同的矩阵在旋转前先进行一次直接比较可以避免不必要的旋转操作if mat target: return True4. 算法复杂度分析4.1 时间复杂度最坏情况下需要尝试3次旋转每次旋转操作需要O(n^2)时间转置和反转各需要O(n^2)所以总时间复杂度为O(n^2)。4.2 空间复杂度如果使用原地旋转空间复杂度为O(1)如果保留原矩阵则需要O(n^2)的额外空间。5. 测试用例设计全面的测试用例应该包括常规情况mat [[1,2],[3,4]] target [[3,1],[4,2]] # 预期True90度旋转匹配多角度匹配mat [[1,1],[1,1]] target [[1,1],[1,1]] # 预期True任何旋转都匹配不匹配情况mat [[1,2],[3,4]] target [[4,3],[2,1]] # 预期False边界情况mat [[1]] target [[1]] # 预期True大矩阵测试验证性能n 10 mat [[(ij)%10 for j in range(n)] for i in range(n)] target [row[:] for row in mat] # 旋转target 270度 for _ in range(3): target rotate90(target) # 预期True6. 实际编码中的注意事项6.1 Python中的列表复制在Python中直接使用rotated mat[:]或rotated list(mat)只能实现浅拷贝对于二维数组需要使用深拷贝# 正确做法 rotated [row[:] for row in mat]6.2 矩阵比较Python中列表的操作符会递归比较所有元素但对于大矩阵可能效率不高。可以提前比较某些特征值来快速排除不匹配的情况。6.3 旋转方向题目没有明确说明旋转方向通常默认为顺时针方向。如果面试中遇到应该先确认旋转方向。7. 扩展思考7.1 非方阵情况如果矩阵不是方阵m x n旋转操作会改变矩阵形状。这种情况下判断是否一致需要考虑更多因素。7.2 任意角度旋转如果题目改为判断是否可以通过任意角度旋转匹配问题将变得复杂得多可能需要使用图像处理中的特征匹配算法。7.3 其他变换组合更一般化的问题可能是判断矩阵是否可以通过旋转、翻转、平移等变换的组合相互转换。这类问题在计算机视觉和模式识别中很常见。8. 同类题目推荐为了加深对矩阵操作的理解可以练习以下LeetCode题目旋转图像螺旋矩阵矩阵置零生命游戏重塑矩阵这些题目都涉及矩阵的各种操作能够全面提升处理二维数组的能力。9. 个人实战经验分享在实际解决这个问题时我遇到了几个值得注意的点旋转方向混淆最初实现时搞混了顺时针和逆时针旋转导致结果错误。解决方法是在纸上画出小矩阵的旋转过程明确坐标变换规律。原地修改问题第一次提交时没有注意到原地旋转会修改原矩阵导致后续测试用例失败。解决方法是在旋转前先复制矩阵。边界条件遗漏最初版本没有处理n1的情况虽然题目保证n≥1但良好的编程习惯应该考虑所有边界情况。Python特性利用发现可以直接使用mat target比较矩阵比逐个元素比较更简洁。但要注意这在大矩阵时可能效率不高。测试用例设计特别设计了全相同元素的矩阵用例验证了算法在这种特殊情况下的正确性。这个题目虽然难度不大但很好地训练了对二维数组的操作能力。建议初学者在解决后尝试用不同方法实现旋转操作并比较它们的性能差异。
企业数字化 ERP 产品动态
相关推荐
Hyperframes:轻量级CLI视频优化方案,专注MP4压缩与原生HTML嵌入 1. 项目概述:Hyperframes 不是“超帧”,而是一套面向现代网页视频体验的轻量级 CLI 工具链你搜“hyperframes”时,大概率会撞上一堆零散关键词:HTML、CSS、MP4、CLI,还有那些反复出现的“植物大战僵尸 HTML 完整代码”… · 2026/11/2 17:41:14
8.0业务系统表结构SQL包导入、验证与二次开发指南 简介:面向易助8.0 ERP系统数据库开发、运维及二次实施人员的表结构参考包,聚焦SQL查询与数据对接场景,系统整理数据库表名称、中文注释以及字段级中文注释,帮助读者在缺少完整数据字典时快速定位业务表、理解字段含义并降低误查误… · 2026/11/2 17:41:42
27种神经网络结构图解:从参数量手算到项目选型 第一次把二十多种神经网络画在同一张纸上,是在一个项目选型的下午。那天我打算从零搭一个识别类任务的原型,脑子里飞速过了一遍手头能用的结构,结果发现一个尴尬的事实:能叫出名字的模型有几十个,能说清“它为什么长这… · 2026/11/2 19:46:29
特种作业电工操作证图值不值得考 上岗必备证书怎么拿 特种作业电工操作证图值不值得考 上岗必备证书怎么拿 实操考试心里没底怕挂科,这几乎是所有准备考特种作业电工操作证的人都会担心的问题。尤其是对于新乡项目现场管理员来说,电工证不仅是上岗必备的硬性条件,更是保障施工安全、避免法律责任的重要凭证。… · 2026/11/7 8:24:38
葫芦岛市特种工保姆级教程:考证避坑指南,帮你快速上岗 葫芦岛市特种工保姆级教程:考证避坑指南,帮你快速上岗 你是不是正在找工作,却发现“必须有特种作业证”才能被录用?别急, 葫芦岛市特种工 的考证流程其实没你想象中那么难,只要掌握一套 保姆级教程 ,就能高效通关,顺利上岗。… · 2026/11/7 8:24:38
内江电工证考试学校含金量高吗?学历不高也能考 内江电工证考试学校含金量高吗?学历不高也能考 你是不是也担心自己学历不高,连内江电工证考试学校报名资格都没?别急,今天我就用十年行业经验告诉你,学历不是问题,关键看你选对地方。内江电工证考试学校虽然名字听着有点陌生,但它的含金量在业内可是有… · 2026/11/7 8:24:38
在通许办电工证好办吗 全流程办理指南 在通许办电工证好办吗 全流程办理指南 证书过期了不知道怎么复审延期,是不是你正经历的焦虑?别慌,全国通用的特种作业操作证,只要按照规范流程走,问题不大。特别是在通许,想办电工证,流程其实并不复杂,但很多新手因为不了解政策、流程和关键细节,导… · 2026/11/7 8:24:38
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41
电工作业提示版通过率揭秘:怎么考才能一次过? 电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41
电工证年审报名千万别踩坑 外省证转过来要搞清这几点 电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23