旋转图像
旋轉圖像
文章目錄
- 旋轉圖像
- 一、題目描述
- 分析
- 方法一:旋轉 + 翻轉
- 代碼
- 方法二:逐層逐位置偏移
- 代碼
一、題目描述
分析
方法一:旋轉 + 翻轉
- 第一步以對角線為軸,翻轉對角線兩側的元素
- 第二部以每行的中點為軸翻轉左右兩次的元素
代碼
class Solution { public:void rotate(vector<vector<int>>& matrix) {//按對角線進行翻轉 for(int i = 0;i < matrix.size();i++){for(int j = i;j < matrix.size();j++){swap(matrix[i][j],matrix[j][i]);}}//每行進行翻轉for(auto& e : matrix){reverse(e.begin(),e.end());}} };方法二:逐層逐位置偏移
- 對每個‘相同位置‘的元素進行旋轉,即對應圖中每種顏色對元素
- 當一層旋轉完成后,進入內層繼續進行對應位置元素的旋轉
對應坐標變換圖:
代碼
class Solution { public:void rotate(vector<vector<int>>& matrix) {int pos1 = 0;int pos2 = matrix[0].size() - 1;//結束條件是只有一個元素的時候while (pos1 < pos2){int add = 0;//注意add的范圍while (add < pos2 - pos1){//旋轉對應位置的4個元素int temp = 0;temp = matrix[pos1][pos1 + add];matrix[pos1][pos1 + add] = matrix[pos2 - add][pos1];matrix[pos2 - add][pos1] = matrix[pos2][pos2 -add];matrix[pos2][pos2 -add] = matrix[pos1 + add][pos2];matrix[pos1 + add][pos2] = temp;add++;}//進入矩陣的內一層繼續對應位置的旋轉pos1++;pos2--;}} };或:
class Solution { public:void rotate(vector<vector<int>>& matrix) {int n = (int)matrix.size();//(n + 1) / 2為總的循環次數,也就是層數,每一圈旋轉完畢后矩陣縮小一圈,// + 1的目的是向上取整for (int i = 0; i < (n + 1) / 2; i ++) {//j可以理解為addfor (int j = 0; j < n / 2; j++) {int temp = matrix[n - 1 - j][i];matrix[n - 1 - j][i] = matrix[n - 1 - i][n - j - 1];matrix[n - 1 - i][n - j - 1] = matrix[j][n - 1 -i];matrix[j][n - 1 - i] = matrix[i][j];matrix[i][j] = temp;}}} };總結
- 上一篇: MySQL基础总结(三)
- 下一篇: 旋转排序数组系列题详解