1. 程式人生 > 其它 >旋轉矩陣的對應的基本操作

旋轉矩陣的對應的基本操作

技術標籤:leetcode刷題演算法理論leetcode演算法java

在leetcode的48題中

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(π)=(1001)
考察關於x軸對稱的變化
( x y ) → ( x − y ) \begin{pmatrix} x \\ y \end{pmatrix} \rightarrow \quad \begin{pmatrix} x \\ -y \end{pmatrix} (xy)(xy)
即可得到上述的變化矩陣,
相應的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=(0110)
對應的對映關係是
( x y ) → ( − y − x ) \begin{pmatrix} x \\ y \end{pmatrix} \rightarrow \quad \begin{pmatrix} -y \\ -x \end{pmatrix} (xy)(yx)
相應的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π)=(0110)
滿足關係
θ 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;
    }

}