Leekcode————旋轉圖像

旋轉圖像

給定一個N x N的二維矩陣表示一個圖像
將圖像順時針旋轉90度
說明:
你必須在原地旋轉圖像,這意味着你須要直接修改輸入的二維矩陣。請不要使用另外一個矩陣來旋轉圖像。
示例 1:java

給定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],c++

原地旋轉輸入矩陣,使其變爲:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:web

給定 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]
]ide

這裏咱們能夠這樣思考,用四個值取上下左右的邊界,移動步長爲右邊界下標減去左邊界下標,每循環一次收縮一次邊界,當左右邊界重合時,移動完成svg

public void Rotate(int[][] matrix){
        int l=0;//定義左下標
        int r=matrix.length-1;//定義右下標
        int c=0;//定義頂層下標
        int f=r;//定義底層下標
        int step,temp;
        while(l<r){
            step=r-l;
            //rotating each element on the matrix outside edges
            for (int i = 0; i < step; i++) {
               temp=matrix[c][l+i];
                matrix[c][l+i]=matrix[f-i][l];
                matrix[f-i][l]=matrix[f][r-i];
                matrix[f][r-i]=matrix[c+i][r];
                matrix[c+i][r]=temp;
            }
            l++;
            r--;
            c++;
            f--;
        }
    }

這道題目若是單論旋轉圖像,有一種取巧的方法spa

/** * 先鏡像翻轉一次數組,再水平倒置一次 * 1 2 3 9 6 3 7 4 1 * 4 5 6 ---> 8 5 2 ----> 8 5 2 * 7 8 9 7 4 1 9 6 3 * * 水平翻轉數組 */
int temp;//用一個臨時變量存儲臨時值
        int n=matrix.length-1;
        for (int i = 0; i < matrix.length-1; i++) {//鏡像翻轉
            for (int j = 0; j < matrix.length-i; j++) {
                temp=matrix[i][j];
                matrix[i][j]=matrix[n-j][n-i];
                matrix[n-j][n-i]=temp;
            }
        }
        for (int i = 0; i < matrix.length/2; i++) {//水平翻轉
            for (int j = 0; j < matrix.length; j++) {
                temp=matrix[i][j];
                matrix[i][j]=matrix[n-i][j];
                matrix[n-i][j]=temp;

            }
        }