对N*N矩阵的旋转可以看成对若干坐标的旋转变换,以matrix[0][0]位置为原点向下、向右做坐标系,使matrix[y][x]落在网格的(x,y)坐标上。对每个点以((N-1)/2,(N-1)/2)为旋转中心,顺时针旋转90°。在(x,y)上的点旋转完应落在(n-y,x)上。
连续旋转4次会回到原点,我们对这样的每一组4个数进行数字的顺时针交换,然后使x加1,直到该行所有点均交换完数字,进入内圈进行相同操作。
时间复杂度:O(N^2)
C++代码:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size() - 1;
while (n > 0)
{
for (int i = 0; i < n; i++)
{
int x = i + (matrix.size() - n) / 2, y = (matrix.size() - n) / 2;
int temp = matrix[y][x];
for (int j = 0; j < 4; j++)
{
swap(x, y);
x = matrix.size() - 1 - x;
swap(matrix[y][x], temp);
}
}
n -= 2;
}
}
};