leetcode Rotate Image
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place?
题目地址:leetcode Rotate Image 题意:给你一个矩阵,让你顺时针旋转90° 思路: 不讨论复制一个数组然后在旋转的方法,因为太简单了。 下面的方法都是in-place的:
- 直接设置top, bottom, left, right四个变量,表示圈定当前要旋转的正方形范围,然后按偏移计算位置,比如左上角的先和右上角交换,然后继续左上角和右下角交换这样即可。
 
- 观察规律,(x,y)要变为(y, n - 1 - x),为了不丢失元素,我逆序的来,先把(x,y)的值给temp,然后把之后要到(x,y)坐标的(就是(n - 1 - y, x))值给(x,y),然后为了不重复计算,第一行列的范围[0, n- 2], 第二行[1,n-3]一次类推即可。
 
- 看到别人的,沿着 这样的 / 对称轴交换,之后只要最后一行变为第一行,倒数第二行变为第二行即进行的逆序即可。
 
方法1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
   | class Solution { public:     void rotate(vector<vector<int>>& matrix) {         if(matrix.empty())             return;         int top = 0, bottom = matrix.size() - 1;         int left = 0, right = matrix[0].size() - 1;         for(;top < bottom && left < right; ++top, ++left, --bottom, --right){             for(int i = left; i < right; ++i){                 int dis = i - left;                                  int row = top + dis;                 int col = right;                 swap(matrix[top][i], matrix[row][col]);                                  row = bottom;                 col = right - dis;                 swap(matrix[top][i], matrix[row][col]);                                  row = bottom - dis;                 col = left;                 swap(matrix[top][i], matrix[row][col]);             }         }     } };
  | 
 
C++思路1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | class Solution { public:     void rotate(vector<vector<int>>& matrix) {         int n = matrix.size();         int start = 0, end = n - 2;         while(start <= end){             int i = start;             for(int j = start; j <= end; ++j){                 int cx = start, cy = j;                 int temp = matrix[cx][cy];                 for(int k = 0; k < 3; ++k){                     int nx = n - 1 - cy, ny = cx;                     matrix[cx][cy] = matrix[nx][ny];                     cx = nx;                     cy = ny;                 }                 matrix[cx][cy] = temp;             }             ++start;             end = n - 2 - start;         }     } };
  | 
 
C++ 思路2
1 2 3 4 5 6 7 8 9 10
   | class Solution { public: 	void rotate(vector<vector<int> > &matrix){ 		int n = matrix.size(); 		for (int i = 0; i < n; i++) 			for (int j = 0; j < n - i - 1; j++) 				swap(matrix[i][j], matrix[n - j - 1][n - i - 1]); 		reverse(matrix.begin(), matrix.end()); 	} };
  | 
 
  python 思路2
1 2 3 4 5 6 7 8 9 10 11
   | class Solution(object):     def rotate(self, matrix):         """         :type matrix: List[List[int]]         :rtype: void Do not return anything, modify matrix in-place instead.         """         n = len(matrix)         for i in range(len(matrix)):             for j in range(len(matrix) - i - 1):                 matrix[i][j], matrix[n - j - 1][n - i - 1] = matrix[n - j - 1][n - i - 1], matrix[i][j]         matrix.reverse()
   | 
 
本文是leetcode如下的题解
更多题解可以查看: https://www.hrwhisper.me/leetcode-algorithm-solution/