leetcode 48 旋转图像
思路:
如果使用辅助矩阵的话,难度并不大,但是题目要求使用O(1)的空间,所以就不能使用辅助矩阵。
不管用还是不用辅助矩阵,都应该先推一下公式:
(x,y)旋转之后到了(y, n - x - 1),对于矩阵中的元素(x, y),如果直接把它赋值给(y, n - x - 1)的话,接下来把(y, n - x - 1)的元素旋转的时候,就会发现它的值已经在之前被覆盖了,所以需要临时变量保存。
注意到题目要求将矩阵顺时针旋转90°,那么旋转4次即可转回来,
对于(i, j)旋转一圈的元素坐标分别是:
(i, j)->(j, n - i - 1)->(n - i - 1, n - j - 1)->(n - j - 1, i)->(i, j).
所以可以逆序旋转,并把(i, j)的值保存下来,那么每个元素都是先旋转在被覆盖的,不会出现先被覆盖在旋转从而导致错误的旋转。
即
int 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;
旋转区域
怎么确定旋转区域呢?对于2X2的矩阵,只需要对一个元素进行一次上述的旋转即可,对于3X3的矩阵需要将左上角1X2的元素进行旋转
显然可得,只需要旋转矩阵的1/4部分即可。
代码:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for (int i = 0; i < n >> 1; i ++ )
for (int j = 0; j < (n + 1) >> 1; j ++ )
{
int 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;
}
}
};