題目描述
給你一幅由 N × N 矩陣表示的圖像,其中每個像素的大小為 4 字節。請你設計一種算法,將圖像旋轉 90 度。
不占用額外內存空間能否做到?
示例:
給定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋轉輸入矩陣,使其變為:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
題目鏈接: https://leetcode-cn.com/problems/rotate-matrix-lcci/
思路1
原地旋轉。將矩陣順時針旋轉 90 度可以分解為兩個步驟:
- 將矩陣按照主對角線(左上~右下)反轉;
- 將矩陣的每一行按照中點進行反轉;
代碼如下:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
if(matrix.empty()) return;
int n = matrix.size();
for(int i=0; i<n; i++){ //按照主對角線翻轉
for(int j=0; j<i; j++){
swap(matrix[i][j], matrix[j][i]);
}
}
for(int i=0; i<n; i++){ // 每一行按照中點進行翻轉
for(int j=0; j<n/2; j++){
swap(matrix[i][j], matrix[i][n-j-1]);
}
}
}
};
- 時間復雜度:O(n^2)
- 空間復雜度:O(1)
思路2
使用額外空間。我們對比旋轉前后的兩個矩陣發現:旋轉前的第 1 行變成了旋轉后的倒數第 1 列、旋轉前的第 2 行變成了旋轉后的倒數第 2 列,也就是旋轉前的第 i 行變成了旋轉后的倒數第 n-i-1 列,i∈[0, n-1]。代碼如下:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
if(matrix.empty()) return;
int n = matrix.size();
vector<vector<int>> copy(n, vector<int>(n, 0));
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
copy[j][n-i-1] = matrix[i][j];
}
}
matrix = copy;
}
};
- 時間復雜度:O(n^2)
- 空間復雜度:O(n^2)
拓展
上面的代碼解決的是矩陣順時針旋轉 90 度,如果是逆時針旋轉 90 度,則也可以分為兩個步驟:
- 將矩陣按照次對角線(左下~右上)反轉;
- 將矩陣的每行按照中點反轉;
假設矩陣次對角線上面區域的一個元素位置為 (i, j),假設 (i, j) 以次對角線對稱的位置為 (a, b),因為 i+a=n-1,j+b=n-1,所以 (i, j) 根據次對角線對稱的位置為 (n-i-1, n-j-1)。代碼如下:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
if(matrix.empty()) return;
int n = matrix.size();
for(int i=0; i<n; i++){ // 次對角線翻轉
for(int j=0; j<n-i; j++){
swap(matrix[i][j], matrix[n-j-1][n-i-1]);
}
}
for(int i=0; i<n; i++){ // 每行按照中點翻轉
for(int j=0; j<n/2; j++){
swap(matrix[i][j], matrix[i][n-j-1]);
}
}
}
};
- 時間復雜度:O(n^2)
- 空間復雜度:O(1)