题解 | #顺时针旋转矩阵#
顺时针旋转矩阵
https://www.nowcoder.com/practice/2e95333fbdd4451395066957e24909cc
我们可以用 两步翻转法 来实现矩阵顺时针旋转 90 度,而不使用额外的存储空间,从而满足空间复杂度 (O(1)) 的要求。具体操作如下:
思路
- 矩阵转置:将矩阵的行列互换,即将元素
matrix[i][j]转换为matrix[j][i]。 - 水平翻转:对每一行的元素从左到右互换,即将
matrix[i][j]与matrix[i][N-j-1]交换。
通过这两步操作,矩阵会顺时针旋转 90 度。
算法步骤
假设矩阵为 (N \times N):
- 转置矩阵:遍历矩阵的上三角区,将
matrix[i][j]与matrix[j][i]交换。 - 水平翻转每一行:对每一行从左到右的元素进行交换,将
matrix[i][j]与matrix[i][N - j - 1]交换。
代码实现
public class Solution {
public int[][] rotateMatrix(int[][] matrix, int n) {
// 1. 转置矩阵
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
// 2. 水平翻转每一行
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 - j - 1];
matrix[i][n - j - 1] = temp;
}
}
return matrix;
}
}
示例运行
输入:
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
步骤:
步骤:
- 转置:
- 水平翻转:
输出:[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
复杂度分析
- 时间复杂度:(O(N^2)),因为需要遍历矩阵的每一个元素。
- 空间复杂度:(O(1)),因为操作在原矩阵上进行,不需要额外空间。
