C++实现矩阵顺时针旋转90度(原地旋转解法)
C++实现矩阵顺时针旋转90度(原地旋转解法)
在计算机算法中,矩阵旋转是经典的数组操作题,尤其是原地顺时针旋转90度的要求,经常出现在校招面试和算法竞赛中。今天就给大家分享一种简单易懂的“两次反转法”,用C++轻松实现矩阵的原地旋转。
一、题目描述
给定一个 n x n 的正方形矩阵,要求在原地将矩阵顺时针旋转90度,不能使用额外的二维数组存储结果。
示例:
输入矩阵:
plaintext
[
[1,2,3],
[4,5,6],
[7,8,9]
]
旋转后输出:
plaintext
[
[7,4,1],
[8,5,2],
[9,6,3]
]
二、解题思路
暴力法需要额外的二维数组存储旋转后的结果,空间复杂度为 O(n^2),不符合“原地旋转”的要求。我们可以用两次反转法,仅通过矩阵转置+行反转实现原地旋转,空间复杂度为 O(1):
1. 矩阵转置:将矩阵沿主对角线(左上到右下)翻转,即交换 matrix[i][j] 和 matrix[j][i](i < j);
2. 反转每行:对转置后的矩阵,逐行反转每个行内的元素,最终得到顺时针旋转90度的结果。
这个思路的核心是利用“转置+行反转”的组合操作,等价于顺时针旋转90度,时间复杂度为 O(n^2)(每个元素仅被操作两次)。
三、C++代码实现
cpp
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
// 第一步:矩阵转置
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
swap(matrix[i][j], matrix],][i]);
}
}
// 第二步:反转每一行
for (int i = 0; i < n; i++) {
reverse(matrix[i].begin(), matrix[i].end());
}
}
};
// 测试示例
int main() {
vector<vector<int>> matrix = {{1,2,3}, {4,5,6}, {7,8,9}};
Solution s;
s.rotate(matrix);
// 输出旋转后的矩阵
for (auto& row : matrix) {
for (int num : row) {
cout << num << " ";
}
cout << endl;
}
return 0;
}
四、代码解释
1. 矩阵转置:遍历矩阵的上三角区域(i \leq j),通过 swap 函数交换对称位置的元素,完成转置;
2. 反转每行:利用C++标准库的 reverse 函数,对转置后的每一行进行反转;
3. 测试示例:主函数中定义了3x3的测试矩阵,调用旋转函数后遍历输出结果,可直接运行验证。
五、拓展思考
如果需要实现逆时针旋转90度,只需调整反转的顺序:先反转每一行,再进行矩阵转置即可。大家可以自己动手尝试编写代码,加深对矩阵操作的理解。
如果这篇文章对你有帮助,欢迎点赞、收藏、关注~有其他算法问题也可以在评论区留言交流!
要不要我帮你补充这篇博文的逆时针旋转90度的代码实现和运行结果演示,让内容更丰富?
更多推荐
所有评论(0)