11.2Rotate Image数组
题目描述
给定一个n * n 的矩阵,求它顺时针旋转90度的结果,且必须在原矩阵上修改,怎么样才能够尽量不创建额外存储空间?
输入输出样例
Input :
{{1,2,3},
{4,5,6},
{7,8,9}}
Output:
\[7,4,1\], \[8,5,2\], \[9,6,3\]
题解
核心逻辑:一圈一圈旋转 + 四个点一组交换
矩阵旋转,本质是每 4 个位置的数字循环换位。
旋转规则(顺时针 90 度)
四个点的位置关系:顶部 → 右侧 → 底部 → 左侧 → 顶部
坐标怎么算?
n = 矩阵边长
-
上:
matrix[i][j] -
右:
matrix[j][n-1-i] -
下:
matrix[n-1-i][n-1-j] -
左:
matrix[n-1-j][i]
交换过程(拿数字 1 举例)
-
先把顶部 1存起来
-
左边 7 移到上面
-
底部 9 移到左边
-
右边 3 移到底部
-
存好的 1 移到右边
cpp
#include <iostream>
#include <vector>
using namespace std;
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size(); // 矩阵边长
for (int i = 0; i < n / 2; ++i) {
for (int j = i; j < n - i - 1; ++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;
}
}
}
void printMatrix(vector<vector<int>>& matrix) {
for (auto& row : matrix) {
for (int num : row) {
cout << num << " ";
}
cout << endl;
}
}
int main() {
vector<vector<int>> matrix = { {1,2,3},{4,5,6},{7,8,9} };
cout << "旋转前:" << endl;
printMatrix(matrix);
rotate(matrix);
cout << "\n旋转后(顺时针90度):" << endl;
printMatrix(matrix);
return 0;
}