Article / 文章

LeetCode 第48题:旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

题目描述

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

难度

中等

题目链接

点击在LeetCode中查看题目

示例

示例 1:

示例1 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

示例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].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

解题思路

两步翻转法

这道题要求在原地旋转矩阵,可以通过两步操作实现:

  1. 先沿主对角线翻转(交换matrix[i][j]和matrix[j][i])
  2. 再左右翻转(交换matrix[i][j]和matrix[i][n-1-j])

关键点:

  1. 主对角线翻转时只需要遍历对角线一侧
  2. 左右翻转时只需要遍历一半列数
  3. 注意边界条件和下标计算
  4. 使用临时变量完成交换

具体步骤:

  1. 沿主对角线翻转矩阵
  2. 对每一行进行左右翻转
  3. 完成90度顺时针旋转

图解思路

算法步骤分析表

步骤 操作 矩阵状态 说明
初始 - [[1,2,3],[4,5,6],[7,8,9]] 原始矩阵
对角线翻转 交换对应元素 [[1,4,7],[2,5,8],[3,6,9]] 沿主对角线翻转
左右翻转 交换对应元素 [[7,4,1],[8,5,2],[9,6,3]] 每行左右翻转

状态/情况分析表

情况 输入 输出 说明
1×1矩阵 [[1]] [[1]] 无需旋转
2×2矩阵 [[1,2],[3,4]] [[3,1],[4,2]] 最小非平凡情况
3×3矩阵 [[1,2,3],[4,5,6],[7,8,9]] [[7,4,1],[8,5,2],[9,6,3]] 标准情况

代码实现

C# 实现

public class 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;
            }
        }
    }
}

执行结果

  • 执行用时:132 ms
  • 内存消耗:40.1 MB

代码亮点

  1. 🎯 使用两步翻转法,思路清晰
  2. 💡 原地操作,不需要额外空间
  3. 🔍 优化循环边界,避免重复操作
  4. 🎨 代码简洁,易于理解

常见错误分析

  1. 🚫 对角线翻转时遍历了整个矩阵
  2. 🚫 左右翻转时计算错误边界
  3. 🚫 忘记使用临时变量导致数据丢失
  4. 🚫 翻转顺序错误

解法对比

解法 时间复杂度 空间复杂度 优点 缺点
额外矩阵 O(n²) O(n²) 直观简单 空间消耗大
两步翻转 O(n²) O(1) 原地操作 不够直观
四点交换 O(n²) O(1) 一次到位 下标复杂

相关题目