LeetCode:旋轉圖像


題目描述

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

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

 

作者:力扣 (LeetCode)

鏈接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnhhkv/

來源:力扣(LeetCode)

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

 

題目解析

例,輸入輸出如下圖:

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

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

首先,我們以數字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。

如下圖示:

 

題目解答

算法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;
            }
        }
    }
};

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


免責聲明!

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



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