【LeetCode热题100】48. 旋转图像——Java多解法详解(附官方题解链接)

张开发
2026/4/19 11:31:31 15 分钟阅读

分享文章

【LeetCode热题100】48. 旋转图像——Java多解法详解(附官方题解链接)
一、题目描述题目链接48. 旋转图像难度中等题目描述给定一个 *n* × *n* 的二维矩阵matrix表示一个图像。请你将图像顺时针旋转 90 度。你必须在原地旋转图像这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1text输入matrix [[1,2,3],[4,5,6],[7,8,9]] 输出[[7,4,1],[8,5,2],[9,6,3]]text原始矩阵 顺时针旋转90°后 [1, 2, 3] [7, 4, 1] [4, 5, 6] → [8, 5, 2] [7, 8, 9] [9, 6, 3]示例 2text输入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二、思路分析题目要求原地旋转意味着不能使用额外的二维数组来辅助。我们需要在 O(1) 额外空间内完成矩阵的旋转。核心思路顺时针旋转 90° 先沿主对角线转置再沿垂直中线水平翻转。text原矩阵 转置后 水平翻转后结果 [1,2,3] [1,4,7] [7,4,1] [4,5,6] → [2,5,8] → [8,5,2] [7,8,9] [3,6,9] [9,6,3]为什么这个组合有效原始位置(i, j)经过转置后变为(j, i)再经过水平翻转第 j 行元素左右镜像最终到达(j, n-1-i)这正是顺时针旋转 90° 的目标位置。三、解法一转置 行反转推荐3.1 思路两步走矩阵转置沿主对角线从左上到右下交换元素matrix[i][j]与matrix[j][i]其中i为行j从i1开始避免重复交换。水平翻转每行对每一行用双指针从两端向中间交换元素即交换matrix[i][j]与matrix[i][n-1-j]。3.2 代码实现javaclass Solution { public void rotate(int[][] matrix) { int n matrix.length; // 第一步矩阵转置沿主对角线交换 for (int i 0; i n; i) { for (int j i 1; j n; j) { int temp matrix[i][j]; matrix[i][j] matrix[j][i]; matrix[j][i] temp; } } // 第二步每一行水平翻转 for (int i 0; i n; i) { int left 0, right n - 1; while (left right) { int temp matrix[i][left]; matrix[i][left] matrix[i][right]; matrix[i][right] temp; left; right--; } } } }3.3 执行流程图解以matrix [[1,2,3],[4,5,6],[7,8,9]]为例第一步转置text[1,2,3] [1,4,7] [4,5,6] → [2,5,8] [7,8,9] [3,6,9]交换过程i0(0,1)与(1,0)交换2 ↔ 4(0,2)与(2,0)交换3 ↔ 7i1(1,2)与(2,1)交换6 ↔ 8第二步水平翻转text[1,4,7] [7,4,1] [2,5,8] → [8,5,2] [3,6,9] [9,6,3]每一行左右反转最终得到顺时针旋转 90° 的结果。3.4 另一种写法原地交换整行javaclass Solution { public void rotate(int[][] matrix) { int n matrix.length; // 转置 for (int i 0; i n; i) { for (int j i; j n; j) { int temp matrix[i][j]; matrix[i][j] matrix[j][i]; matrix[j][i] temp; } } // 每行反转使用双指针 for (int i 0; i n; i) { for (int j 0; j n / 2; j) { int temp matrix[i][j]; matrix[i][j] matrix[i][n - 1 - j]; matrix[i][n - 1 - j] temp; } } } }四、解法二逐层旋转一次性四元素交换4.1 思路直接从外向内逐层处理每一层将矩阵划分为四个子区域每次同时交换四个对应的元素。对于位置(i, j)顺时针旋转 90° 后它会到达(j, n-1-i)。利用这个映射可以一次性完成四个元素的循环交换texttemp matrix[i][j] matrix[i][j] matrix[n-1-j][i] matrix[n-1-j][i] matrix[n-1-i][n-1-j] matrix[n-1-i][n-1-j] matrix[j][n-1-i] matrix[j][n-1-i] temp4.2 代码实现javaclass Solution { public void rotate(int[][] matrix) { int n matrix.length; // 从外向内逐层旋转 for (int i 0; i n / 2; i) { // 层数 for (int j i; j n - 1 - i; j) { // 当前层的元素偏移 // 保存左上角元素 int temp matrix[i][j]; // 左下角 → 左上角 matrix[i][j] matrix[n - 1 - j][i]; // 右下角 → 左下角 matrix[n - 1 - j][i] matrix[n - 1 - i][n - 1 - j]; // 右上角 → 右下角 matrix[n - 1 - i][n - 1 - j] matrix[j][n - 1 - i]; // 左上角暂存 → 右上角 matrix[j][n - 1 - i] temp; } } } }4.3 图解说明以 3×3 矩阵为例最外层四个角text[1, 2, 3] 1(左上) → 7(左下) → 9(右下) → 3(右上) → 1 [4, 5, 6] [7, 8, 9]matrix[0][0](1) 应该去[0][2](3) 的位置matrix[0][2](3) 应该去[2][2](9) 的位置matrix[2][2](9) 应该去[2][0](7) 的位置matrix[2][0](7) 应该去[0][0](1) 的位置四个元素形成循环用临时变量保存其中一个即可完成轮换。五、解法对比总结维度转置 行反转法逐层旋转法核心思想组合变换转置 水平翻转逐层处理四元素组代码复杂度简洁易于理解稍复杂坐标计算较多辅助空间O(1)O(1)时间复杂度O(n²)O(n²)面试推荐度⭐⭐⭐⭐⭐⭐⭐⭐推荐转置 行反转法更简洁直观是面试中的首选写法。六、复杂度分析时间复杂度O(n²)。转置操作遍历上三角部分交换约 n(n-1)/2 次水平翻转遍历每一行交换约 n × (n/2) 次。合计 O(n²)。空间复杂度O(1)。全程仅使用常数级临时变量无额外数据结构。七、面试高频追问Q1为什么必须先转置再水平翻转顺序反了会怎样如果先水平翻转再转置得到的是逆时针旋转 90°的结果而非顺时针。操作顺序不可逆。Q2如果要求逆时针旋转 90°如何实现两种方法转置 垂直翻转列反转先转置再对每一列进行上下翻转水平翻转 转置先水平翻转每一行再转置Q3如何处理 n1 的边界情况当 n1 时只有一个元素无需任何操作。两种解法的循环条件都能正确处理外层循环不执行或内层循环不执行。Q4如何扩展到旋转 180° 或 270°旋转 180°先水平翻转再垂直翻转或连续执行两次顺时针 90°旋转 270°即逆时针 90°先转置再垂直翻转每列八、相关题目推荐54. 螺旋矩阵 —— 螺旋遍历矩阵操作经典题59. 螺旋矩阵 II —— 生成螺旋矩阵498. 对角线遍历 —— 矩阵对角线遍历九、参考资料官方题目链接48. 旋转图像 - 力扣LeetCode官方题解链接48. 旋转图像 - 官方题解官方视频题解48. 旋转图像 Rotate Image【LeetCode 力扣官方题解】

更多文章