给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 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]
]
思路如下
首先要通过演算推出赋值公式,我的草稿如下
每一步就是把 matrix[x][y] 赋值给 matrix[y][n-1-x],之后就好说了。
预定义变量有这么几个
x , y 是矩阵的坐标,first用来指示x每次循环的起始点,temp用来记录每次会被覆盖的值(每循环一次就会递归四次,交换四个点位,用temp记录将要被覆盖但是下次递归需要的那个点位的值),number用来计数(每次循环递归只执行四次),n表示矩阵每一行的长度。
每次循环交换四个点位,每判断一次while就交换完每一圈的值,所以while的条件是 y<n/2 ,每次递归前把number置零,并用temp记录第一个交换的点位,用于给下个点位赋值。
在递归 change方法中先判断执行次数不大于四次(等于四次则说明每次for循环的四个点位已经交换完毕,就结束本次递归),之后就是先记录matrix[y][n-1-x] 的值用于下次交换,然后把之前记录的 matrix[x][y]的值赋值给 matrix[y][n-1-x]。
就这么简单
class Solution {
public void rotate(int[][] matrix) {
int x =0,y=0,temp=0,number = 0,n = matrix.length;
while(y<(n>>1)){
for(x = y;x<n-1-y;x++){
number = 0;
temp = matrix[x][y];
change(x,y,matrix,temp,n,number);
}
y++;
}
}
private void change(int x,int y,int[][] matrix,int temp,int n,int number){
if(number++==4)return;
int tmp = matrix[y][n-1-x];
matrix[y][n-1-x] = temp;
change(y,n-1-x,matrix,tmp,n,number);
}
}