原地旋轉矩陣

2021-06-18 06:48:58 字數 937 閱讀 8243

題目:

給定乙個大小為n*n的矩陣a,如何在空間複雜度為o(1)的情況下,將矩陣順時針旋轉90度?

解析:

對於矩陣旋轉,最容易想到的便是利用乙個大小同樣為n*n的臨時矩陣t,將原矩陣a[i][j] 放在 t[j][n-i-1]位置處。最後將矩陣t的資料拷貝置矩陣a中,完成矩陣的旋轉。但是這種方法的空間複雜度為o(n^2),不滿足題目的o(1)的要求。

其實仔細思考一下,我們可以知道矩陣a中位置[i,j]處的資料,旋轉後應該處於[j, n-i-1].按照這個規律,我們可以寫出:

[i, j] -> [j, n-i-1] -> [n-i-1, n-j-1] -> [n-j-1, i] -> [i, j], 即元素旋轉後的最終位置構成這樣乙個迴圈,因此我們只需要乙個迴圈交換位置,則可以將四個位置的元素放置旋轉後的最終位置。具體的實現過程我們可以用分層的方式來完成,如下圖所示:

圖中有3個方框,分別代表這個矩陣的三層,在旋轉過後,每個元素所屬的層是不會變的。因此在實現過程中,我們只需要依次對每一層分別進行迴圈交換操作即可完成矩陣的旋轉過程。

**實現:

void inplacerotatematrix(int **a, int n)

//while(tmp_i != i && tmp_j != j)

a[cur_i][cur_j] = t;

}//for(int j = 0; j < n; j++)

}//for(int i = 0; i < n; i++)

}//inplacerotatematrix

推到 旋轉矩陣公式 旋轉矩陣公式推導

1.在二維平面中 如下圖所示,在xoyxoy平面中有一向量op x,y top x,y t,旋轉 角後變為向量op x y top x y t。據圖可得 x op cos y op sin x op cos y op sin 經旋轉 角後有 x op cos op cos cos sin sin x...

旋轉矩陣演算法

question 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 void func int n 要求 通過傳入的n,輸出乙個4 4的矩陣,順序如上圖所示.code nxn矩陣 include using namespace std include define max...

旋轉矩陣推導

一 前言 2.1二維向量的旋轉 2.2三維向量的旋轉 二維擴充套件到三維,其實還是蠻簡單的,我們不妨將上面的圖,再修改下,就可以得到如下圖 正如你看到的,新增了乙個 z,就變成了三維空間了。上面將op順時針繞著z軸旋轉了 角度。這裡我們要注意兩點 1 我們站在xy平面,朝著z軸的正方向看,我們揮舞著...