旋轉矩陣的對應的基本操作
技術標籤:leetcode刷題演算法理論leetcode演算法java
在leetcode的48題中
,考察了旋轉 π 2 \frac{\pi}{2} 2π角度之後,如何拆解成基本的軸操作進行替換,其實可以理解成尤拉角相關的,但是對於本題而言,用尤拉角確實有點大材小用,簡單的二維矩陣即可做一些簡單的拆解,通過相關的基本操作,可以得到一些列的操作,在後續題目中可以通過這些操作進行各個角度的變換,但是毫無疑問,這裡肯定是不會考察很複雜的操作了
第一個,按照 x軸對稱,相應的計算矩陣
σ
x
(
π
)
=
(
1
0
0
−
1
)
\sigma_x(\pi) = \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix} \quad
考察關於x軸對稱的變化
(
x
y
)
→
(
x
−
y
)
\begin{pmatrix} x \\ y \end{pmatrix} \rightarrow \quad \begin{pmatrix} x \\ -y \end{pmatrix}
(xy)→(x−y)
即可得到上述的變化矩陣,
相應的Java實現程式碼為
public static int[][] reverseMatrix(int[][] nums){
if (nums.length != nums[0].length)
return null;
int n = nums.length;
// int m = n/2;
for (int i = 0; i < n/2; i++){
for(int j = 0; j < n;j++){
int temp = nums[i][j];
nums[i][j] = nums[n-i-1][j];
nums[n-i-1][j] = temp;
}
}
return nums;
}
關於y = x對稱的操作,即反對角線的對稱
(
x
y
)
→
(
y
x
)
\begin{pmatrix} x \\ y \end{pmatrix} \rightarrow \quad \begin{pmatrix} y \\ x \end{pmatrix}
(xy)→(yx)
public static int[][] croDigReverse(int[][] nums){
if (nums.length != nums[0].length)
return null;
int n = nums.length;
for (int i = 0; i < n; i++){
for (int j = 0; j < n-i;j++){
int temp = nums[i][j];
nums[i][j] = nums[n - 1 -j][n - 1 -i];
nums[n - 1 -j][n - 1 -i] = temp;
}
}
return nums;
}
而對於y = -x對稱即關於矩陣的對角線對稱操作,則對應的矩陣是
θ
y
=
−
x
=
(
0
−
1
−
1
0
)
\theta_{y =-x} = \begin{pmatrix} 0 & -1 \\ -1 & 0 \end{pmatrix} \quad
θy=−x=(0−1−10)
對應的對映關係是
(
x
y
)
→
(
−
y
−
x
)
\begin{pmatrix} x \\ y \end{pmatrix} \rightarrow \quad \begin{pmatrix} -y \\ -x \end{pmatrix}
(xy)→(−y−x)
相應的Java程式碼為
public static int[][] dignalReverseMatrix(int[][] nums){
// 檢查是否為方陣
if (nums.length != nums[0].length)
return null;
int n = nums.length;
for (int i = 0; i < n;i++){
for (int j = 0; j < i; j++) {
int temp = nums[i][j];
nums[i][j] = nums[j][i];
nums[j][i] = temp;
}
}
return nums;
}
在上述基礎變化之後,本題就變得容易了,不難發現該操作
θ
z
(
π
2
)
=
(
0
1
−
1
0
)
\theta_{z}(\frac{\pi}{2}) = \begin{pmatrix} 0 & 1 \\ -1 & 0 \end{pmatrix} \quad
θz(2π)=(0−110)
滿足關係
θ
z
(
π
2
)
=
θ
y
=
−
x
⋅
σ
x
(
π
)
\theta_{z}(\frac{\pi}{2}) =\theta_{y =-x} \cdot \sigma_x(\pi) \quad
θz(2π)=θy=−x⋅σx(π)
即先進行
σ
x
(
π
)
\sigma_x(\pi)
σx(π) 操作之後,再進行
θ
y
=
−
x
\theta_{y =-x}
θy=−x操作,即等效於的是
θ
z
(
π
2
)
\theta_{z}(\frac{\pi}{2})
θz(2π),因此最終的實現程式碼即是
class Solution {
public void rotate(int[][] matrix) {
dignalReverseMatrix(reverseMatrix(matrix));
}
public int[][] reverseMatrix(int[][] nums){
int n = nums.length;
// int m = n/2;
for (int i = 0; i < n/2; i++){
for(int j = 0; j < n;j++){
int temp = nums[i][j];
nums[i][j] = nums[n-i-1][j];
nums[n-i-1][j] = temp;
}
}
return nums;
}
public void dignalReverseMatrix(int[][] nums){
// 檢查是否為方陣
int n = nums.length;
for (int i = 0; i < n;i++){
for (int j = 0; j < i; j++) {
int temp = nums[i][j];
nums[i][j] = nums[j][i];
nums[j][i] = temp;
}
}
// return nums;
}
}