一.题目
Rotate Image
Total Accepted: 32380 Total
Submissions: 102010My
Submissions
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?
Show Tags
Have you met this question in a real interview?
Yes
No
二.解题技巧
由于要求将图像顺时针旋转90度,最简单的做法就是画个图出来观察旋转90度之后的图像的情况,经过分析可知,顺时针旋转90度就是将原来的图像的最后一行作为第一列,倒数第二行作为第二列,因此类推,第一行作为最后一列。如果直接根据这种做法来做,由于要找到原始图像的坐标与旋转后对应的坐标之间的关系比较难,只能创建一个大小为n*n的临时图像来进行复制操作,然后将旋转后的图像复制回原来的图像中。这种做法的时间复杂度为O(n^2),空间复杂度为O(n^2)。
由于无论图像进行什么角度的选择,左上角的点都可以看作坐标系的原点,因此,将原始的图像抽象为一个四个顶点分别为1-2-3-4的矩形,顺时针旋转90度之后的图像的抽象即为四个顶点分别为4-1-2-3的矩形。对于这种结果,可以先将原始图像进行水平对称,这样,得到图像的抽象为2-1-4-3,然后将水平对称后的图像进行沿着对角线的对称,得到的抽象即为4-1-2-3,即可得到旋转90度后的结果。具体的流程如下图:
上面的先将图像进行水平对称,然后进行45度对称的方法,时间复杂度为O(n^2), 空间复杂度为O(1)。
三.实现代码
#include <iostream> #include <vector> using namespace std; class Solution { private: void Mirror(vector<vector<int> >& matrix) { const int N = matrix.size(); const int Half = N / 2; for (int IndexOfRows = 0; IndexOfRows < N; IndexOfRows++) { for (int IndexOfCols = 0; IndexOfCols < Half; IndexOfCols++) { int Tmp = matrix[IndexOfRows][IndexOfCols]; matrix[IndexOfRows][IndexOfCols] = matrix[IndexOfRows][N - 1 - IndexOfCols]; matrix[IndexOfRows][N - 1 - IndexOfCols] = Tmp; } } } void RotateFour(vector<vector<int> >& matrix) { const int N = matrix.size(); for (int IndexOfRows = 0; IndexOfRows < N - 1; IndexOfRows++) { for (int IndexOfCols = 0; IndexOfCols < N - 1 - IndexOfRows; IndexOfCols++) { int Tmp = matrix[IndexOfRows][IndexOfCols]; matrix[IndexOfRows][IndexOfCols] = matrix[N - 1 - IndexOfCols][N - 1 - IndexOfRows]; matrix[N - 1 - IndexOfCols][N - 1 - IndexOfRows] = Tmp; } } } public: void rotate(vector<vector<int> > &matrix) { // 水平对称 Mirror(matrix); // 45度对称 RotateFour(matrix); } };
四.体会
这道题有点小技巧在里面,由于是需要in-place进行,我的理解是空间复杂度为O(1),因此,应该考虑旋转后的图片与原来的图片的关系,根据上面的分析可以知道,旋转后的图片就是先将原来的图片进行水平对称,然后再进行45度对称,因此,而进行对称是完全可以in-place进行的,因此,按照上面的做法,空间复杂度为O(1)。
版权所有,欢迎转载,转载请注明出处,谢谢