LeetCode48--Rotate Image

這一題實際上可以找規律完成,它讓我們把整個數組旋轉90度。
我們可以從外圈開始轉,一圈一圈搞定它。
一個元素旋轉後的位置,取決於本身的位置與當前這個圈的邊長。
我們簡單找幾個元素算一下就可以發現規律了(注意:找規律的題一定要保留中間的計算過程,不要急着化簡!做數學題和計算機題都是這樣
我簡單測試了幾個數據,已經放在註釋裏了,感興趣的可以自己推一推這個過程。

如果要問我怎麼想到是找規律的?題目不讓你額外開數組,那肯定是有什麼辦法巧妙實現的,我初始是發現,若把整個圈展開,其實交換的點他們的距離是一樣的,且在同一個圈裏,每次交換的距離保持一致,那這肯定是有規律的了;然後把點放回正方形裏,簡單算一下就行了。
好啦,Show Code

#include<algorithm>
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        //把要翻轉的矩陣外圈展開,得到一條直線。設此時這個外圈邊長爲x(下標從零開始)那麼:
        //然後分別處理第一條邊上的每一個點。
        //位於第一排的被轉到第二列;位於第二列的被轉到了第二排,位於第二排的被轉到了第一列,位於第一列的被轉到了第一排
        //如(0,1)元素 
        //(0,1)-->(1,n-1)-->(n-1,n-2)-->(n-2,0)-->(0,1)  
        //如(0,3)元素
        //(0,3)-->(3,n-1)-->(n-1,n-4)-->(n-4,0)-->(0,3)
        //如(1,k)元素
        //(1,k)-->(k,n-1-1)-->(n-1-1,n-1-k)-->(n-1-k,1)-->(1,k)
        //按照上面的順序,先遍歷完外圈,然後範圍往中間縮1,起始位置行列各加1,當下標達到了一半則停止計算
        int temp,item;
        int n = matrix[0].size();
        int i0 = 0,j0 = 0,n0 =  n;
        while(i0 < matrix[0].size()/2)//小於一半則繼續
        {
            if(i0 >= n0)//當錯位時,結束吧
                break;
            //限定第一排的起始位置
            for(int j = j0;j < n0-1;++j)
            {
                //拿到第一排的元素(x0,j)了,先把第二列的對應元素取出來,再把它放到那個位置
                // item = matrix[x0][j];
                // temp = matrix[j][n-j];
                // matrix[j][n-j] = item;//順時針一個個換也可以,但是寫起來不好看,直接逆向交換
                swap(matrix[i0][j],matrix[n-1-j][i0]);//處理好對應的下標即可
                swap(matrix[n-1-j][i0],matrix[n-1-i0][n-1-j]);
                swap(matrix[n-1-i0][n-1-j],matrix[j][n-1-i0]);
            }
            i0+=1;
            j0+=1;
            n0-=1;
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章