给定一个 n × n 的二维矩阵 matrix
表示一个图像。请你将图像顺时针旋转 90 度。
你必须在原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 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]]
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
方法1:直接循环交换
它采用了直接交换的方法,通过循环对矩阵的每一个环进行旋转。
class Solution {
public void rotate(int[][] matrix) {
int length = matrix.length; // 获取矩阵的长度
// 遍历矩阵的每一个环
for (int i = 0; i < length / 2; i++) { // 计算需要旋转的大圈数
for (int j = i; j < length - i - 1; j++) { // j < length - i - 1:确定需要旋转的每 4 个数的小圈数
int temp = 0;
int m = length - i - 1; // m,n 确定 matrix[i][j] 外,其他数的相对位置
int n = length - j - 1;
// 结合图实际比对,对应位置互换
temp = matrix[i][j];
matrix[i][j] = matrix[n][i];
matrix[n][i] = matrix[m][n];
matrix[m][n] = matrix[j][m];
matrix[j][m] = temp;
}
}
}
}
这个函数接受一个二维矩阵 matrix
作为输入,并且直接对该矩阵进行原地修改,使其顺时针旋转 90 度。函数使用了两层循环来遍历矩阵的每一个环,然后对每一个环中的元素进行交换。
具体地,外层循环 i
表示需要旋转的大圈数,内层循环 j
表示当前需要旋转的小圈数。在内层循环中,通过计算得到需要交换的四个位置的坐标,然后将它们对应位置上的元素进行交换。
这种算法的时间复杂度为 O(n^2),其中 n 是矩阵的边长。因为对于一个 n x n 的矩阵,需要旋转的环的数量是 n/2,每个环中有 4 个元素需要交换,所以总的操作次数为 4 * n/2 * n/2 = 2n^2。
方法2:先上下交换,在对角线交换(最容易理解)
将一个二维矩阵顺时针旋转 90 度。它分两步进行旋转:先进行上下交换,然后进行对角线交换。
class Solution {
public void rotate(int[][] matrix) {
int length = matrix.length;
// 先上下交换
for (int i = 0; i < length / 2; i++) {
int[] temp = matrix[i];
matrix[i] = matrix[length - i - 1]; // 注意 length - i - 1:需要变化,往上移
matrix[length - i - 1] = temp;
}
// 再对角线交换
for (int i = 0; i < length; i++) {
for (int j = i + 1; j < length; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
}
这个函数接受一个二维矩阵 matrix
作为输入,并且直接对该矩阵进行原地修改,使其顺时针旋转 90 度。
- 首先,外层循环遍历了矩阵的上半部分,通过交换每一行与对称位置的行,实现了上下交换。
- 接着,内层循环遍历了矩阵的对角线上半部分(左上角到右下角的对角线),通过交换对角线两侧的元素,实现了对角线交换。
这种算法的时间复杂度为 O(n^2),其中 n 是矩阵的边长。