1. 程式人生 > >[Leetcode] rotate image 旋轉圖片

[Leetcode] rotate image 旋轉圖片

blog 進行 pan 處理 ima 方式 splay ace etc

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up:
Could you do this in-place?

方法一:常規思路: 將圖片分為 行數/2 層,然後一層層進行旋轉,由外到裏。在這個過程中,比較關鍵的是下標的處理。可從n=3時得出一定的規律。每次旋轉時,分析替換的元素對的下標和行、列的關系。如 i=0、j=0時 1:[0][0]換為 7:[2][0]。

技術分享

代碼如下:

 1 class Solution {
 2 public:
3 void rotate(vector<vector<int> > &matrix) 4 { 5 int n=matrix.size(); 6 for(int i=0;i<n/2;++i) 7 { 8 for(int j=i;j<n-1-i;++j) 9 { 10 int temp=matrix[i][j]; 11 matrix[i][j]=matrix[n-1-j][i];
12 matrix[n-1-j][i]=matrix[n-1-i][n-1-j]; 13 matrix[n-1-i][n-1-j]=matrix[j][n-1-i]; 14 matrix[j][n-1-i]=temp; 15 } 16 } 17 18 } 19 };

方法二:參考Grandyang博客中方法三。其大體的思路是,先求原矩陣的轉置矩陣,然後反正轉置矩陣中的每一行的元素,即可。轉置矩陣:把矩陣A的行換成相應的列,得到的新矩陣稱為A的轉置矩陣,記作AT

。轉置矩陣的得到的方式是如下圖所示,沿對角線,綠色箭頭兩端的元素對調,得到轉置矩陣,然後每一行的元素反轉,得到最後要求的矩陣。

技術分享

代碼如下:

 1 class Solution {
 2 public:
 3     void rotate(vector<vector<int> > &matrix) 
 4     {
 5         int n = matrix.size();
 6         for (int i = 0; i < n; ++i) 
 7         {
 8             for (int j = i + 1; j < n; ++j) 
 9             {
10                 swap(matrix[i][j], matrix[j][i]);
11             }
12             reverse(matrix[i].begin(), matrix[i].end());
13         }
14     }
15 };

[Leetcode] rotate image 旋轉圖片