力扣-48 旋轉影像

hero_th發表於2020-12-19

題目描述

給定一個 n × n 的二維矩陣表示一個影像。將影像順時針旋轉 90 度。

說明:

你必須在原地旋轉影像,這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉影像。

示例

給定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],

原地旋轉輸入矩陣,使其變為:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]

方法一:暴力解法

  • 可以輕易的找出旋轉的規律:原矩陣的第一行變成新矩陣的最後一列,原矩陣的第二行變成新矩陣的倒數第二列、、、依次類推
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        auto matrix_new = matrix;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n;j++) {
                matrix_new[j][n - i - 1] = matrix[i][j];
            }
        }
        matrix = matrix_new;
    }
};

複雜度分析

  • 時間複雜度:O(N^2),其中 N 是 matrix 的邊長。

  • 空間複雜度:O(N^2)。我們需要使用一個和matrix 大小相同的輔助陣列。

方法二:原地解法(in place)

由方法一的關鍵等式:matrix_new[j][n - i - 1] = matrix[i][j];
但是如果直接原地複製操作的話就是把矩陣的值覆蓋掉,所以需要建立一個臨時變數temp,然後進行展開:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        for (int i = 0; i < n / 2; i++) {
            for (int j = 0; j < (n + 1) / 2; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - j - 1][i];
                matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
                matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
                matrix[j][n - i - 1] = temp;
            }
        }
    }
};

複雜度分析

  • 時間複雜度:O(N^2),.
    其中 N 是 matrix 的邊長。我們需要列舉的子矩陣大小為 O(⌊n/2⌋×⌊(n+1)/2⌋)=O(N^2)。

  • 空間複雜度:O(1)。為原地旋轉。

方法三:上下翻轉 然後矩陣轉置即可

  • 這個方法非常容易理解,也非常簡單,但是需要練習了足夠多的題目才可以很快的想出來哦!
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) 
    {
        int n = matrix.size();
        if (n <= 1)
            return;
        int temp;
        //將矩陣上下翻轉
        for (int i = 0; i < n / 2; ++i) {
            for (int j = 0; j < n; ++j) {
                temp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - i][j];
                matrix[n - 1 - i][j] = temp;
            }
        }
        //矩陣的轉置
        for (int i = 0; i < n; ++i) {
            for (int j = i; j < n; ++j) {
                temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        return;
    }
};

複雜度分析:

  • 時間複雜度:O(n^2)
  • 空間複雜度:O(1)

相關文章