leetcode 48 旋轉影象
阿新 • • 發佈:2021-08-30
連結:https://leetcode-cn.com/problems/rotate-image/
題目
給定一個 n×n 的二維矩陣matrix 表示一個影象。請你將影象順時針旋轉 90 度。
你必須在 原地 旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉影象。
示例
輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[[7,4,1],[8,5,2],[9,6,3]]
輸入: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]]
示例 3:
輸入:matrix = [[1]]
輸出:[[1]]
示例 4:
輸入:matrix = [[1,2],[3,4]]
輸出:[[3,1],[4,2]]
思路
該題很明顯是一道數學題。如果可以藉助輔助陣列,非常簡單,直接放入輔助陣列對應位置即可;
不借用輔助陣列情況下:
可以在原陣列上對每個位置進行交換,順時針的交換規則為:nums[row][col]->nums[nums.size()-col-1][row]->a[nums.size()-row-1][nums.size()-col-1]->nums[col][nums.size()-row-1]
對每一個正方形的的最外層進行遍歷,其中最外層的最後一個無需變換,然後對內一層的正方形繼續遍歷
我的程式碼
class Solution { public: void rotate(vector<vector<int>>& matrix) { for (int i = 0; i<matrix.size() - 1; i++) { for (int j = i; j<matrix.size() - i - 1; j++) { int memory = matrix[i][j]; int p = 3; int pi = i, pj = j,swap1; while (p--) { matrix[pi][pj] = matrix[matrix.size() - pj-1][pi]; swap1 = pi; pi = matrix.size() - pj-1; pj = swap1; } matrix[pi][pj] = memory; } } } };
官方題解的原陣列翻轉
他的反轉思路與我不同,他將正方形需要反轉的部分分成四塊 再根據順時針位置座標更改規則交換
程式碼
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;
}
}
}
};
還有一種思路
順時針旋轉即先將正方形上下反轉,再沿對主角線反轉
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; ++j) {
swap(matrix[i][j], matrix[n - i - 1][j]);
}
}
// 主對角線翻轉
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
swap(matrix[i][j], matrix[j][i]);
}
}
}
};