LeetCode:旋轉影像

楊凱2020 發表於 2021-12-04
LeetCode

題目描述

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

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

 

作者:力扣 (LeetCode)

連結:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnhhkv/

來源:力扣(LeetCode)

著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

 

題目解析

例,輸入輸出如下圖:

LeetCode:旋轉影像

這個題目與其說是一道演算法題,不如說是一道找規律得題目,我們怎樣才能實現影像得90度旋轉呢?通過對比輸入輸出圖中數字得位置可以發現:我們可以將第一列得4個數通過順時針旋轉到第一行上,第一行順時針旋轉到最後一列上,一次類推;內圈的數字也要如此旋轉,就可以完成題目要求,如下圖:

LeetCode:旋轉影像

有了思路之後,我們怎麼通過演算法實現呢?那就是找規律了。

首先,我們以數字5為例,看一下它以及和他有關的數字的變化路徑:5->11 11->16 16->15 15->5;

其次,我們繼續找規律,我們將上述數字集合線標來一遍:

  • 5(0,0)->11(0,3)  

  • 11(0,3)->16(3,3)

  • 16(3,3)->15(3,0)

  • 15(3,0)->5(0,0)

從下標中我們能夠發現有重複的下標相互轉換數字,那麼他們其中有什麼內在的連續呢?我們現在找規律已經使用了數字轉換流程,數字的下標,仔細想一下我們是不是還有一個關鍵的變數沒有用到,那就是n*n;

最後,我們加上二維陣列的行列長度再來一遍:

  • 5([i]:0,[j]:0)->11([i]:0,[n-i或者j-1]:3) 

  • 11()

寫到第二條的時候我發現寫不下去了,這裡的下標有大量的0和3,沒有辦法分辨是i還是j,寫出來的規律也不能通用,因此我決定用數字1及其相關的數字類找規律(i=0,j=1)

首先,

  • 1->10

  • 10->12

  • 12->13

  • 13->1

其次,

  • 1(0,1)->10(1,3)

  • 10(1,3)->12(3,2)

  • 12(3,2)->13(2,0)

  • 13(2,0)->(0,1)

最後,

  • 1([i]:0,[j]:1)->10([j]:1,[n-i-1]:3)

  • 10([j]:1,[n-i-1]:3)->12([n-i-1]:3,[n-j-1]:2)

  • 12([n-i-1]:3,[n-j-1]:2)->13([n-j-1]:2,[i]:0)

  • 13([n-j-1]:2,[i]:0)->1([i]:0,[j]:1)

我們找到一下通用變數,有興趣的可以套一下數字9及其相關數字的規律:

令:int m=n-i-1,c=n-j-1。

如下圖示:

LeetCode:旋轉影像
 

題目解答

演算法1,時間複雜度為 o(n²),直接上程式碼如下:

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

解題思路:解題思路再題目分析中已經詳細闡明,此次不再累述。