Rotate Matrix:给定一个N * N
的矩阵,将矩阵顺时针旋转90
度。是否可以原地旋转呢?
最简单的方法就是由外到内按层进行旋转,将上面的转到右面,右面的转到下面,下面的转到左面,左面的转到上面。
可以把上面的一行先拷贝到一个临时空间中,然后依次把左面的一列拷贝到上面的一行,下面的一行拷贝到左面的一列,右面的一列拷贝到下面的一行,最后再将临时空间中的一行拷贝到右边的一列。这种方法需要额外的O(N)
空间复杂度。
一种改进的方法是从外层到内层,逐个元素的进行旋转,当然也可以从内到外。
class Solution {
public:
void rotate(vector<vector<int>> &matrix) {
int iTmp = 0;
size_t N = matrix.size();
//无论N的奇偶,都需要旋转N / 2层,从第0层开始
for(size_t layer = 0; layer < N / 2; layer++)
{
//每层旋转N - 1 - layer个元素,从第0个开始
size_t first = layer, last = N - 1 - layer;
for(size_t i = first; i < last; i++)
{
iTmp = matrix[layer][i];
matrix[layer][i] = matrix[N - 1 - i][layer];//左->上
matrix[N - 1 - i][layer] = matrix[N - 1 - layer][N - 1 - i];//下->左
matrix[N - 1 - layer][N - 1 - i] = matrix[i][N - 1 - layer];//右->下
matrix[i][N - 1 - layer] = iTmp;//上->右
}
}
}
};