给定一个 n × n 的二维矩阵 matrix
表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
示例 2:
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
这道题乍一看是没啥思路的,想了半天发现可以找一下旋转前后行列之间的关系,因为是旋转90度,所以旋转前的行会变成列,列会变成行,既然有了这个思路我们找规律就会更快,最后可以得出,旋转前的i行会变成旋转后的n-1-i列(n是行数),而旋转前的i列会变成旋转后的i行,这样子就明显了,接下来我们只需要创建一个中间矩阵来作为中间量给原数组赋值即可完成。代码如下:
class Solution {
public void rotate(int[][] matrix) {
int [][]a=new int[matrix.length][matrix[0].length];
// 将数组 matrix 的所有值复制到数组 a
for (int i = 0; i < matrix.length; i++) {
System.arraycopy(matrix[i], 0, a[i], 0, matrix[i].length);
}
int n=matrix.length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[j][n - 1 - i] = a[i][j];
}
}
}
/**
System.arraycopy(src, srcPos, dest, destPos, length);
src: 源数组。这个是你要复制数据的数组。
srcPos: 源数组的起始位置。这个是你要开始复制的源数组的索引位置。
dest: 目标数组。这个是你要将数据复制到的数组。
destPos: 目标数组的起始位置。这个是你要开始存放数据的目标数组的索引位置。
length: 复制的长度。这个是要从源数组复制到目标数组的元素数量。
*/
}