)
LeetCode 48. 旋转图像 超详细题解原地旋转双解法 文章目录题目描述与示例题目核心要求与难点解题思路分析原地旋转方法一先转置再反转每行推荐方法二原地分层旋转硬核手撕代码逐行精讲多测试用例验证复杂度分析常见坑点总结面试答题技巧LeetCode 48. 旋转图像面试高频原地修改无额外空间大家好这道题是矩阵操作经典面试题核心考察原地算法和矩阵变换逻辑严禁使用额外矩阵存储必须直接修改原数组。本文带来两种易懂好记的解法兼顾笔试速刷和面试手撕代码简洁无BUG可直接提交AC。题目描述给定一个n × n的二维矩阵matrix表示一个图像请你将图像顺时针旋转 90 度。关键要求必须在原地旋转图像直接修改输入的二维矩阵不允许使用另一个矩阵。示例 1输入matrix [[1,2,3],[4,5,6],[7,8,9]] 输出[[7,4,1],[8,5,2],[9,6,3]]示例 2输入matrix [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]] 输出[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]提示n matrix.length matrix[i].length1 n 20-1000 matrix[i][j] 1000题目难点与核心要求原地修改不能开辟新矩阵只能在原数组上交换元素正方形矩阵行列数相等固定n×n结构顺时针90度找准坐标变换规律避免方向出错无返回值直接修改传入的matrix参数解题思路两种通用方法方法一先转置 每行反转推荐易懂易记这是最适合笔试和面试的写法步骤清晰代码简短不容易出错两步完成旋转。矩阵转置以主对角线为轴交换行列元素matrix[i][j] ↔ matrix[j][i]反转每一行将转置后的矩阵每一行元素逆序排列两步操作后即可得到顺时针旋转90度的结果全程原地修改无额外空间开销。方法二原地分层旋转硬核考察坐标把矩阵看成多层嵌套的正方形从外层到内层逐层旋转逐个定位四个对应顶点的坐标直接交换元素适合考察底层坐标变换的场景。方法一推荐AC代码转置反转from typing import List class Solution: def rotate(self, matrix: List[List[int]]) - None: Do not return anything, modify matrix in-place instead. 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 i in range(n): matrix[i].reverse()方法二原地分层旋转代码硬核手撕from typing import List class Solution: def rotate(self, matrix: List[List[int]]) - None: Do not return anything, modify matrix in-place instead. n len(matrix) # 分层处理从外层到内层 for i in range(n // 2): # 每层内的元素遍历 for j in range(i, n - i - 1): # 记录四个顶点坐标顺时针交换 temp matrix[i][j] matrix[i][j] matrix[n - j - 1][i] matrix[n - j - 1][i] matrix[n - i - 1][n - j - 1] matrix[n - i - 1][n - j - 1] matrix[j][n - i - 1] matrix[j][n - i - 1] temp代码逐行精讲方法一推荐第一步矩阵转置遍历矩阵只遍历上三角区域j从i开始避免重复交换交换matrix[i][j]和matrix[j][i]完成主对角线翻转3×3矩阵转置后结果[[1,4,7], [2,5,8], [3,6,9]]第二步每行反转对每一行执行逆序操作调用列表内置reverse方法反转后得到最终旋转结果[[7,4,1], [8,5,2], [9,6,3]]代码优势代码极短记忆成本低笔试快速写出全程原地操作无额外空间占用逻辑直观不容易出现边界错误方法二精讲分层旋转原理n阶矩阵共有n//2层比如3阶矩阵只有1层4阶矩阵有2层每层确定四个对应位置顺时针轮换赋值坐标公式固定套路直接套用左上角(i, j) 左下角(n-j-1, i) 右下角(n-i-1, n-j-1) 右上角(j, n-i-1)用临时变量保存首位依次轮换赋值完成原地旋转。测试用例验证全覆盖用例13×3标准矩阵matrix [[1,2,3],[4,5,6],[7,8,9]] Solution().rotate(matrix) print(matrix) # 输出[[7,4,1],[8,5,2],[9,6,3]]用例24×4矩阵matrix [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]] Solution().rotate(matrix) print(matrix) # 输出[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]用例3最小1×1矩阵matrix [[1]] Solution().rotate(matrix) print(matrix) # 输出[[1]]用例42×2矩阵matrix [[1,2],[3,4]] Solution().rotate(matrix) print(matrix) # 输出[[3,1],[4,2]]复杂度分析时间复杂度O(n²)需要遍历矩阵中每一个元素空间复杂度O(1)原地修改仅使用常数个临时变量完全符合题目要求常见坑点总结旋转图像高频坑点违规使用额外矩阵不符合题目原地修改要求转置时遍历全矩阵导致元素重复交换结果错乱旋转方向搞反变成逆时针旋转分层旋转时坐标计算错误出现越界或错位忽略函数无返回值的要求错误return结果面试答题技巧优先推荐转置反转写法逻辑清晰不易出错先讲清楚两步操作流程再动手写代码强调原地修改空间复杂度O(1)贴合题目要求如果面试官要求底层坐标变换再手写分层旋转法测试边界用例1×1、2×2小矩阵验证代码正确性总结一句牢记顺时针旋转90度速记先转置再反转每行。这道题是矩阵原地操作的入门题两种方法都要掌握方法一适合快速解题方法二适合深入理解坐标变换是面试手撕高频题务必熟练掌握。相关推荐LeetCode 54. 螺旋矩阵同款矩阵遍历边界处理