【LeetCode-數組】旋轉矩陣(順時針/逆時針)


題目描述

給你一幅由 N × N 矩陣表示的圖像,其中每個像素的大小為 4 字節。請你設計一種算法,將圖像旋轉 90 度。

不占用額外內存空間能否做到?
示例:

給定 matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],

原地旋轉輸入矩陣,使其變為:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]

題目鏈接: https://leetcode-cn.com/problems/rotate-matrix-lcci/

思路1

原地旋轉。將矩陣順時針旋轉 90 度可以分解為兩個步驟:

  • 將矩陣按照主對角線(左上~右下)反轉;
  • 將矩陣的每一行按照中點進行反轉;

代碼如下:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        if(matrix.empty()) return;

        int n = matrix.size();
        for(int i=0; i<n; i++){  //按照主對角線翻轉
            for(int j=0; j<i; j++){
                swap(matrix[i][j], matrix[j][i]);
            }
        }

        for(int i=0; i<n; i++){  // 每一行按照中點進行翻轉
            for(int j=0; j<n/2; j++){
                swap(matrix[i][j], matrix[i][n-j-1]);
            }
        }
    }
};
  • 時間復雜度:O(n^2)
  • 空間復雜度:O(1)

思路2

使用額外空間。我們對比旋轉前后的兩個矩陣發現:旋轉前的第 1 行變成了旋轉后的倒數第 1 列、旋轉前的第 2 行變成了旋轉后的倒數第 2 列,也就是旋轉前的第 i 行變成了旋轉后的倒數第 n-i-1 列,i∈[0, n-1]。代碼如下:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        if(matrix.empty()) return;

        int n = matrix.size();
        vector<vector<int>> copy(n, vector<int>(n, 0));
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                copy[j][n-i-1] = matrix[i][j];
            }
        }
        matrix = copy;
    }
};
  • 時間復雜度:O(n^2)
  • 空間復雜度:O(n^2)

拓展

上面的代碼解決的是矩陣順時針旋轉 90 度,如果是逆時針旋轉 90 度,則也可以分為兩個步驟:

  • 將矩陣按照次對角線(左下~右上)反轉;
  • 將矩陣的每行按照中點反轉;

假設矩陣次對角線上面區域的一個元素位置為 (i, j),假設 (i, j) 以次對角線對稱的位置為 (a, b),因為 i+a=n-1,j+b=n-1,所以 (i, j) 根據次對角線對稱的位置為 (n-i-1, n-j-1)。代碼如下:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        if(matrix.empty()) return;

        int n = matrix.size();
        for(int i=0; i<n; i++){  // 次對角線翻轉
            for(int j=0; j<n-i; j++){
                swap(matrix[i][j], matrix[n-j-1][n-i-1]);
            }
        }
        
        for(int i=0; i<n; i++){  // 每行按照中點翻轉
            for(int j=0; j<n/2; j++){
                swap(matrix[i][j], matrix[i][n-j-1]);
            }
        }
    }
};
  • 時間復雜度:O(n^2)
  • 空間復雜度:O(1)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM