hot100 旋转图像(48)

📅 2026/7/3 4:56:27
hot100 旋转图像(48)
本题采用矩阵转置结合行翻转算法解决“原地旋转图像”问题。其核心本质是通过几何学中的轴对称与中心对称变换组合等价替代复杂的四角环状元素置换。该解法在满足严格 O(1) 额外空间约束的同时最终走向是通过两次局部线性对调直接实现图像的顺时针 90 度旋转。一、 问题本质与几何模型在二维坐标系中将一个大小为 n × n 的矩阵顺时针旋转 90 度其数学映射关系可以表示为原矩阵中坐标为(i, j)的元素旋转后将移动到新矩阵的(j, n - 1 - i)位置。如果直接对矩阵元素进行“一步到位”的原地移动由于空间冲突必须采用四角环状擦除交换的逻辑其控制流边界判断较为复杂。本解法利用线性代数中的矩阵变换特性将旋转 90 度这一复杂的几何拓扑运动拆解为两步基础矩阵操作的叠加沿主对角线转置Transpose将行列索引对调映射关系为(i,j)→(j,i)沿垂直中轴线左右翻转Reverse Rows对转置后的矩阵每一行进行逆序排列映射关系为(j,i)→(j,n−1−i)两步复合后的最终映射结果为(i,j)→(j,n−1−i)该结果与顺时针旋转 90 度的数学目标完全对齐。二、 算法演进对比在处理二维矩阵的就地旋转拓扑问题时双重变换法有效平衡了代码可读性与空间开销解法名称时间复杂度空间复杂度核心原理物理瓶颈 / 缺陷辅助矩阵映射O(n^2)O(n^2)申请同等大小的全新二维数组直接根据公式new[j][n-1-i] old[i][j]进行单次赋值产生了等同于原输入矩阵规模的物理内存开销违反原地修改约束四角环状置换O(n^2)O(1)将矩阵按圈层划分每四个关联单元格通过单个临时变量进行闭环原地轮转编码层面的索引边界计算极其复杂极易发生边界溢出和越界错误转置 行翻转当前解法O(n^2)O(1)先沿主对角线进行互换再对每一行执行左右对称位置的对调需要对矩阵整体执行两轮完备的局部扫描三、 核心控制逻辑拆解提供的源码在物理执行上由两个不嵌套的顺序循环体构成1. 对角线转置阶段控制条件外层i遍历所有行内层j的范围严格限制在0 j i。逻辑事实内层循环条件j i确保了算法只扫描矩阵的主对角线左下方区域。每次命中将matrix[i][j]与对角线对称位置的matrix[j][i]进行对调。如果j的范围扩大到整个行j n则会导致元素被重复对调两次从而使矩阵恢复原状。2. 行内逆序翻转阶段控制条件外层循环遍历矩阵的每一行row内层j的范围限制在前半行0 j row.length / 2。逻辑事实使用双指针相向靠拢的原理将当前的row[j]与其后半段对称位置的row[row.length - 1 - j]进行常数级对调完成单行的完全逆序。四、 算法执行状态机步进示例以示例 1 为输入数据matrix [[1,2,3],[4,5,6],[7,8,9]]n 3内部状态演进过程如下1. 初始拓扑状态1 2 3 4 5 6 7 8 92. 第一阶段对角线转置对角线元素[1, 5, 9]保持不动其余对称位置交换当i 1, j 0时matrix[1][0](4)与matrix[0][1](2)对调。当i 2, j 0时matrix[2][0](7)与matrix[0][2](3)对调。当i 2, j 1时matrix[2][1](8)与matrix[1][2](6)对调。转置结束后的矩阵状态1 4 7 2 5 8 3 6 93. 第二阶段行内逆序翻转第 0 行[1, 4, 7]首尾对调变为[7, 4, 1]第 1 行[2, 5, 8]首尾对调变为[8, 5, 2]第 2 行[3, 6, 9]首尾对调变为[9, 6, 3]行翻转结束后的最终矩阵状态完美达成顺时针旋转 90 度7 4 1 8 5 2 9 6 3五、源码实现class Solution { public void rotate(int[][] matrix) { // 边界安全检查 if (matrix null || matrix.length 1) { return; } int n matrix.length; // 步骤 1主对角线转置 // 严格控制 j i仅遍历矩阵的左下半三角防止二次对调失效 for (int i 0; i n; i) { for (int j 0; j i; j) { int temp matrix[i][j]; matrix[i][j] matrix[j][i]; matrix[j][i] temp; } } // 步骤 2每一行执行左右翻转 // 遍历所有行利用双指针向中间靠拢的机制对调整行元素 for (int[] row : matrix) { for (int j 0; j row.length / 2; j) { int temp row[j]; row[j] row[row.length - 1 - j]; row[row.length - 1 - j] temp; } } } }六、 复杂度极限分析1. 时间复杂度O(n^2)精确计数转置阶段执行的有效对调次数为下三角网格数n×(n−1)/2 次。行翻转阶段每行执行 n/2 次对调n 行共执行n×n/2 次。结论总的基本指令置换次数为 n2−n/2 次。算法的时间消耗与矩阵内的单元格总数即 n2呈严格的线性正比关系达到了处理全量数据必经的时间下限。2. 空间复杂度O(1)分析整个置换过程完全在传入的matrix二维数组原本的内存块内部进行原地算法。在运行期间算法仅在两处局部对调中交替申请了一个基础类型的整型变量temp作为暂存中转以及有限个控制迭代的循环变量。结论没有申请任何与输入规模相关的外部数据结构其分配的额外物理内存空间始终保持固定空间复杂度为常数阶 O(1)。