力扣-48 旋轉影像
題目描述
給定一個 n × n 的二維矩陣表示一個影像。將影像順時針旋轉 90 度。
說明:
你必須在原地旋轉影像,這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉影像。
示例
給定 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]
]
方法一:暴力解法
- 可以輕易的找出旋轉的規律:原矩陣的第一行變成新矩陣的最後一列,原矩陣的第二行變成新矩陣的倒數第二列、、、依次類推
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
auto matrix_new = matrix;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n;j++) {
matrix_new[j][n - i - 1] = matrix[i][j];
}
}
matrix = matrix_new;
}
};
複雜度分析
-
時間複雜度:O(N^2),其中 N 是 matrix 的邊長。
-
空間複雜度:O(N^2)。我們需要使用一個和matrix 大小相同的輔助陣列。
方法二:原地解法(in place)
由方法一的關鍵等式:matrix_new[j][n - i - 1] = matrix[i][j];
但是如果直接原地複製操作的話就是把矩陣的值覆蓋掉,所以需要建立一個臨時變數temp,然後進行展開:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for (int i = 0; i < n / 2; i++) {
for (int j = 0; j < (n + 1) / 2; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = temp;
}
}
}
};
複雜度分析
-
時間複雜度:O(N^2),.
其中 N 是 matrix 的邊長。我們需要列舉的子矩陣大小為 O(⌊n/2⌋×⌊(n+1)/2⌋)=O(N^2)。 -
空間複雜度:O(1)。為原地旋轉。
方法三:上下翻轉 然後矩陣轉置即可
- 這個方法非常容易理解,也非常簡單,但是需要練習了足夠多的題目才可以很快的想出來哦!
class Solution {
public:
void rotate(vector<vector<int>>& matrix)
{
int n = matrix.size();
if (n <= 1)
return;
int temp;
//將矩陣上下翻轉
for (int i = 0; i < n / 2; ++i) {
for (int j = 0; j < n; ++j) {
temp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - i][j];
matrix[n - 1 - i][j] = temp;
}
}
//矩陣的轉置
for (int i = 0; i < n; ++i) {
for (int j = i; j < n; ++j) {
temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
return;
}
};
複雜度分析:
- 時間複雜度:O(n^2)
- 空間複雜度:O(1)
相關文章
- LeetCode 48. 旋轉影像LeetCode
- 力扣·33. 搜尋旋轉排序陣列力扣排序陣列
- 力扣-81. 搜尋旋轉排序陣列 II力扣排序陣列
- (五)旋轉影像
- LeetCode:旋轉影像LeetCode
- LeetCode-048-旋轉影像LeetCode
- 影像縮放、旋轉、翻轉、平移
- 教你如何玩轉力扣力扣
- 影像旋轉的FPGA實現(一)FPGA
- 高效能運算-NEON-影像旋轉
- 不適用imrotate 的影像旋轉實現
- 影像旋原始碼原始碼
- C# 簡易影像處理(包括平移,旋轉,翻轉, 裁切)C#
- LeetCode 力扣 羅馬數字轉整數LeetCode力扣
- 力扣---2020.7.30力扣
- 力扣---2020.9.27力扣
- 力扣---2020.9.29力扣
- 力扣---2020.9.28力扣
- 力扣---2020.9.3力扣
- 力扣---2020.9.4力扣
- 力扣之反轉字串中的單詞 III力扣字串
- 程式設計師如何玩轉力扣刷題?程式設計師力扣
- LeetCodeHot100 73. 矩陣置零 54. 螺旋矩陣 48. 旋轉影像 240. 搜尋二維矩陣 IILeetCode矩陣
- 力扣2713 2024.6.19力扣
- 力扣2589 5.16力扣
- 力扣1542 2024.5.22力扣
- 力扣題解力扣
- 力扣(LeetCode)543力扣LeetCode
- 力扣(LeetCode)934力扣LeetCode
- 力扣(LeetCode)103力扣LeetCode
- 力扣(LeetCode)513力扣LeetCode
- 力扣(LeetCode)389力扣LeetCode
- 力扣(LeetCode)796力扣LeetCode
- 力扣(LeetCode)863力扣LeetCode
- 力扣(LeetCode)310力扣LeetCode
- 力扣(LeetCode)130力扣LeetCode
- 力扣(LeetCode)965力扣LeetCode
- 力扣之僅僅反轉字母(雙指標方式)力扣指標