1.题目描述
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise).
【翻译过来】:题目很简单,给了一个n*n的2D方阵,我们需要将其顺时针旋转90°。
2. 分析
咋看之下,题目其实很简单,而我check了一下发现这道题竟然是中等难度,通过率也是才38%,不过我们还是先分析一下。
2.1. 方案1
举个例子就很好懂了,观察下面这个矩阵:
a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
a41 a42 a43 a44
经过顺时针旋转90°之后变为以下矩阵:
a41 a31 a21 a11
a42 a32 a22 a12
a43 a33 a23 a13
a44 a34 a24 a14
我们需要以行和列为整体观察,即:我们观察每一列和每一行的位置变化情况:
- 原矩阵中第一列的逆置成为新矩阵的第一行;
- 原矩阵中第二列的逆置成为新矩阵的第二行;
- 原矩阵中第三列的逆置成为新矩阵的第三行;
- 原矩阵中第四列的逆置成为新矩阵的第四行;
即:原矩阵第i列的逆置成为新矩阵的第i行。
得到这个结论之后就容易操作了,很简单,我们遍历的时候按照列优先开始遍历,遍历完一列之后进行逆置,作为新矩阵的行即可。
2.2. 方案2
看了讨论区别人的算法,有一个同样为O(n^2)复杂度的算法,不过空间复杂度要比我们的低一些,直接交换某些元素对应位置即可。它的核心思想是其实元素是按照一个环进行移动的,掌握这个环的规律移动位置即可。
3. 源码
3.1. 方案1
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int N = matrix.size();
vector<vector<int> >temp = matrix;
matrix.clear();
vector<int> row;
for (int j = 0; j < N; j++) {
for (int i = 0; i < N; i++) {
row.push_back(temp[i][j]);
}
reverse(row.begin(), row.end());
matrix.push_back(row);
row.clear();
}
}
};
3.2. 方案2
public class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length, temp;
for(int i = 0; i < n / 2; i++)
for(int j = i; j < n - i - 1; j++) {
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;
}
}
}
4. 心得
虽然是一道中等难度的题目,但是难度还不是很大。不过涉及到逆置的操作是直接用了里面的reverse(V.begin(), V.end())。