1. 程式人生 > >leetcode-48.旋轉圖像

leetcode-48.旋轉圖像

tco back end tar tps 鏡像 -a class lee

leetcode-48.旋轉圖像

point: 數組

題意

給定一個 n × n 的二維矩陣表示一個圖像。

將圖像順時針旋轉 90 度。

說明:

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

示例 1:

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

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

示例 2:

給定 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]
]

算法1

簡單點就是,用一個棧來按照順序存儲每個元素,然後再依次循環更新數組。但是題目要求在原地實現。

技術分享圖片
 1 class Solution {
 2 public:
 3     void rotate(vector<vector<int>>& matrix) {
 4         vector<int> temp;
 5         int i, j;
 6         for(i=matrix[0].size()-1; i>=0; i--)
 7         {
 8             for(int j=0; j<matrix.size(); j++)
9 { 10 temp.push_back(matrix[j][i]); 11 } 12 } 13 14 for(i=0; i<matrix.size(); i++) 15 { 16 for(j=0; j<matrix[0].size(); j++) 17 { 18 matrix[i][j] = temp[temp.size()-1]; 19 temp.pop_back();
20 } 21 } 22 } 23 };
View Code

算法2

先轉置矩陣,再反轉(左右鏡像)。左右交換可以使用reverse(begin, end)

技術分享圖片
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int i, j;
        for(i=0; i<matrix.size(); i++)
        {
            for(int j=0; j<i; j++)
            {
                swap(matrix[i][j], matrix[j][i]);
            }
        }
        
        for(i=0; i<matrix.size(); i++)
        {
            reverse(matrix[i].begin(), matrix[i].end());
        }
    }
};
View Code

leetcode-48.旋轉圖像