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°可以分解为两步操作:
- 矩阵转置(主对角线交换元素)
- 每一行水平翻转(左右镜像)
- 两步操作均为原地操作,无需额外矩阵空间。
算法步骤
- 对矩阵进行转置:遍历上三角区域,交换
matrix[i][j]与matrix[j][i]; - 对每一行进行水平翻转:遍历每一行的前半部分,交换
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°的原地操作是矩阵类题目的经典模板,转置+水平翻转的组合是最简洁高效的实现方式。