解题思路:
\qquad
这道题同样需要用模拟解决,原地算法要求空间复杂度尽量小,最好为
O
(
1
)
O(1)
O(1)。模拟的关键是找到旋转的内在规律,即旋转前后的位置坐标的变化规律。
\qquad 正方形矩阵类似洋葱,可以由不同大小的正方形数字分层组合而成,而旋转后的元素只在所在的那一层中进行位置变换,且四次变换后可回到原位置,若将元素四次变换经过的位置找出来,把元素按照旋转顺序进行一次移动即可完成旋转。
\qquad
我们把一层正方形提取出来看,定义正方形左上角的坐标为[i, i]
,正方形边长为n
,则正方形边界为m = i+n-1
,边上任意位置元素[i, i+j]
经过一次旋转得到[i+j, m]
,经过第二次旋转得到[m, m-j]
,继续旋转得[m-j, i]
,最后旋转又回到[i, i+j]
。将这四个位置上的元素按顺序移动即可完成旋转,正方形一条边上所有的元素旋转完毕后,进入下一层,i+1
且n-2
。当n <= 1
时,可以认为矩阵已经旋转完成。
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
int i = 0, temp = 0;
while(n > 1)
{
for(int j = 0; j < n-1; j++)
{
temp = matrix[i][i+j];
matrix[i][i+j] = matrix[i+n-1-j][i];
matrix[i+n-1-j][i] = matrix[i+n-1][i+n-1-j];
matrix[i+n-1][i+n-1-j] = matrix[i+j][i+n-1];
matrix[i+j][i+n-1] = temp;
}
i++;
n -= 2;
}
}