LeetCode 补拙笔记 日期:2026.05.26 题目:48. 旋转图像

LeetCode 补拙笔记

0. 前言

  • 日期:2026.05.26
  • 题目:48. 旋转图像
  • 难度:中等
  • 标签:数组、矩阵、原地算法

1. 题目理解

问题描述

给定一个 n × n 的二维矩阵 matrix,将其原地顺时针旋转 90 度,不能使用额外矩阵空间。

示例

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

输出:[[7,4,1],[8,5,2],[9,6,3]]

2. 解题思路

核心观察

  • 顺时针旋转90°可以分解为两步操作:
    1. 矩阵转置(主对角线交换元素)
    2. 每一行水平翻转(左右镜像)
  • 两步操作均为原地操作,无需额外矩阵空间。

算法步骤

  1. 对矩阵进行转置:遍历上三角区域,交换 matrix[i][j]matrix[j][i]
  2. 对每一行进行水平翻转:遍历每一行的前半部分,交换 matrix[i][j]matrix[i][n-1-j]

3. 代码实现

java 复制代码
package lc48;

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

4. 代码优化说明

减少分支判断,合并变量声明,代码更紧凑:

java 复制代码
package lc48;

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

5. 复杂度分析

  • 时间复杂度 :O(n2)O(n^2)O(n2)
    两次遍历矩阵,总操作次数为 n2n^2n2 级。
  • 空间复杂度 :O(1)O(1)O(1)
    仅使用常数级临时变量,原地修改矩阵。

6. 总结

  • 核心思路:转置 + 水平翻转,将旋转问题拆解为两个简单的原地操作;
  • 优化后代码逻辑更紧凑,减少了冗余变量和分支,可读性更高;
  • 关键技巧:顺时针旋转90°的原地操作是矩阵类题目的经典模板,转置+水平翻转的组合是最简洁高效的实现方式。
相关推荐
EllinY36 分钟前
CF2217E Definitely Larger 题解
c++·笔记·算法·构造
nnsix1 小时前
JIT(即时编译)、 AOT(预先编译)、虚拟机CLR 笔记
笔记
NULL指向我2 小时前
Simplis仿真笔记1:Simplis_V8.4_x64安装过程
笔记
ouliten3 小时前
[Triton笔记6]层标准化
笔记
玖釉-4 小时前
下一个排列:从字典序到原地算法的完整推导
数据结构·c++·windows·算法
IronMurphy4 小时前
【算法五十】62. 不同路径
算法
影寂ldy4 小时前
C#一维数组
算法
玄米乌龙茶1234 小时前
思维导图笔记:Prompt工程
笔记·prompt
过期动态5 小时前
【LeetCode 热题 100】移动零
java·数据结构·算法·leetcode·职场和发展·rabbitmq