這一題實際上可以找規律完成,它讓我們把整個數組旋轉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;
}
}
};