题目
给定一个 n×nn \times nn×n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
正确答案
swap 版
cpp
class Solution
{
public:
void rotate(vector<vector<int>>& matrix)
{
int n = matrix.size();
for (int i = 0; i < n / 2; i += 1)
{
for (int j = 0 ; j < (n + 1) / 2; j += 1)
{
// 从 matrix[i][j]开始,逆时针处理
// swap 左边的横坐标 == swap 右边的纵坐标
// swap 左边的纵坐标 + swap 右边的横坐标 == n - 1
// swap 的右边在下一个 swap 的左边
// 左下到左上
swap(matrix[i][j], matrix[n - 1 - j][i]);
// 右下到左下
swap(matrix[n - 1 - j][i], matrix[n - 1 - i][n - 1 - j]);
// 右上到右下
swap(matrix[n - 1 - i][n - 1 - j], matrix[j][n - 1 - i]);
// 左上到右上(不需要执行,便于理解)
// swap(matrix[j][n - 1 - i], matrix[i][j]);
}
}
return;
}
};
赋值版
cpp
class Solution
{
public:
void rotate(vector<vector<int>>& matrix)
{
int n = matrix.size();
for (int i = 0; i < n / 2; i++)
{
for (int j = 0; j < (n + 1) / 2; j++)
{
int temp = matrix[i][j];
// 左下到左上
matrix[i][j] = matrix[n - 1 - j][i];
// 右下到左下
matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
// 右上到右下
matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
// 左上到右上
matrix[j][n - 1 - i] = temp;
}
}
}
};
记忆口诀
无论哪种方法,都可以直接参考下面的口诀。
从 matrix[i][j]开始,逆时针处理
swap 左边的横坐标 == swap 右边的纵坐标
swap 左边的纵坐标 + swap 右边的横坐标 == n - 1
swap 的右边在下一个 swap 的左边
赋值版基本也是一致的,把口诀中的 swap 改成 等号 就可以了。