代码训练LeetCode(45)旋转图像
代码训练(45)旋转图像
Author: Once Day Date: 2025年7月11日
漫漫长路,才刚刚开始…
全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客
参考文章:
- 48. 旋转图像 - 力扣(LeetCode)
- 力扣 (LeetCode) 全球极客挚爱的技术成长平台
文章目录
- 代码训练(45)旋转图像
- 1. 原题
- 2. 分析
- 3. 代码实现
- 4. 总结
1. 原题
给定一个 n × n 的二维矩阵
matrix
表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 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]]
2. 分析
该问题要求我们给定一个 n×n 的二维矩阵,代表一个图像,需要将图像顺时针旋转 90 度。重点在于“原地”操作,即不使用额外的存储空间来完成这个旋转。
原理分析,顺时针旋转 90 度意味着:
- 第一行变成了最后一列。
- 第二行变成了倒数第二列。
- 依此类推,直到最后一行变成了第一列。
解题思路:
- 转置矩阵:首先对矩阵进行转置,即行列互换。转置后,matrix[i][j] 会变成 matrix[j][i]。
- 反转每一行:将转置后的每一行进行反转,即第一个元素和最后一个元素交换,第二个和倒数第二个交换,依此类推。
分析步骤,以 3x3 矩阵为例,进行以下操作:
原始矩阵:
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
优化关键点:
- 空间复杂度:由于是原地操作,不需要额外空间,空间复杂度为 O(1)。
- 时间复杂度:操作涉及到两次遍历矩阵,时间复杂度为 O(n^2)。
3. 代码实现
void rotate(int** matrix, int matrixSize, int* matrixColSize) {// 转置矩阵for (int i = 0; i < matrixSize; i++) {for (int j = i; j < matrixSize; j++) {int temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;}}// 反转每一行for (int i = 0; i < matrixSize; i++) {for (int j = 0; j < matrixSize / 2; j++) {int temp = matrix[i][j];matrix[i][j] = matrix[i][matrixSize - 1 - j];matrix[i][matrixSize - 1 - j] = temp;}}
}
4. 总结
这个问题考验了对矩阵操作的理解和实现能力,特别是原地修改的技术。通过实践这类问题,可以加深对数组和矩阵操作的理解,提高编程能力和对复杂问题的处理能力。