給定一個 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);
}
}