旋轉圖像 及其解答

給定一個 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);
    } 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章