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度的代码实现和运行结果演示,让内容更丰富?

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐