一、题目概述
二、思路方向
要在原地顺时针旋转一个
n x n
的二维矩阵 90 度,你可以通过一系列交换操作来实现。这里的关键在于理解旋转后的矩阵与原矩阵之间的元素对应关系。假设原矩阵为
matrix
,其中matrix[i][j]
表示第i
行第j
列的元素。旋转 90 度后,matrix[i][j]
的新位置变为matrix[j][n-1-i]
。由于要原地旋转,我们不能直接按这个关系来赋值,因为这会导致原始数据丢失。相反,我们可以使用一种“层”的概念,从外向内逐层交换元素。每一层包含四个边(两个行边和两个列边),我们按顺时针方向交换这四个边上的元素。
三、代码实现
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++) {
int left = 0, right = n - 1;
while (left < right) {
int temp = matrix[i][left];
matrix[i][left] = matrix[i][right];
matrix[i][right] = temp;
left++;
right--;
}
}
}
}
执行结果:
四、小结
这个解决方案首先将矩阵沿对角线翻转(即交换
matrix[i][j]
和matrix[j][i]
),然后反转每一行。这两步操作结合起来,就实现了矩阵的顺时针 90 度旋转。这种方法的时间复杂度是 O(n^2),其中 n 是矩阵的边长,因为我们需要访问矩阵中的每个元素两次(一次是对角线翻转,一次是行反转)。空间复杂度是 O(1),因为我们是在原地修改矩阵,没有使用额外的空间(除了几个用于交换的临时变量)。
结语
在这喧嚣的世界里
找到一片属于自己的宁静之地
让心灵得以栖息
!!!