旋转图像
题目链接
题目描述
解题思路
方法1:分块旋转
这个可以把整个矩阵分成四块去旋转。类似于数组的移动,先将其中一个存储起来,然后以此使其等于下一个。直到最后那个等于存起来的值。
就如图一般,将矩阵A存入临时数组temp,将矩阵B赋给矩阵A,将矩阵C赋给矩阵B,将矩阵D赋给矩阵C,将临时数组temp赋给矩阵A,这样就完成了矩阵图像的旋转。
矩阵也分奇数行,和偶数行,不过奇数行的最中间那一格不用动,偶数行的矩阵和奇数行的运转是一样的。
这个的关键在于如何控制小矩阵变换的时候,下标的值。我们现在给矩阵的每个角都写上顺序,这样可以更清楚的计算矩阵移动时的下标,必须每个下标都和被赋值的相对应。
代码
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
if(n == 0)
return ;
int b = n / 2; //宽
int a = n - b; //长
int[][] temp = new int[b][a];
for(int i = 0;i < b;i++){ //将矩阵A存储到临时数组中
for(int j = 0;j < a;j++){
temp[i][j] = matrix[a - j - 1][i];
}
}
for(int i = 0;i < b;i++){ //将矩阵B移动到矩阵A的位置
for(int j = 0;j < a;j++){
matrix[a - j - 1][i] = matrix[n - i - 1][a - j - 1];
}
}
for(int i = 0;i < b;i++){ //将矩阵C移动到矩阵B的位置
for(int j = 0;j < a;j++){
matrix[n - i - 1][a - j - 1] = matrix[b + j][n - i - 1];
}
}
for(int i = 0;i < b;i++){ //将矩阵D移动到矩阵C的位置
for(int j = 0;j < a;j++){
matrix[b + j][n - i - 1] = matrix[i][b + j];
}
}
for(int i = 0;i < b;i++){ //将存储矩阵A的临时数组放置到矩阵D的位置
for(int j = 0;j < a;j++){
matrix[i][b + j] = temp[i][j];
}
}
}
}