LeetCode 第48题:旋转图像

75 阅读3分钟

LeetCode 第48题:旋转图像

题目描述

给定一个 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)一次到位下标复杂

相关题目