给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
既然题目要求不适用额外空间能否做到,那我们先使用额外空间和最挫的方法来实现:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        vector<vector<int>> res;
        int n = matrix.size();
        for(int i = 0;i < n;i++)
        {
            vector<int> line;
            for(int j = n - 1;j >= 0;j--)
            {
                line.push_back(matrix[j][i]);
            }
           res.push_back(line);
        }

        swap(res,matrix);
    }
};

先构建旋转后的新行,然后每一行插入到res中,最后交换res和matrix。时间复杂度和空间复杂度都是N的平方。
运行结果:

执行结果:
通过
显示详情
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:7.1 MB, 在所有 C++ 提交中击败了73.13%的用户

原地翻转

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;
            }
        }
    }
};

通过归纳推演,从个例到普遍,详细的解法参考旋转矩阵--力扣题解

两次翻转

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        //水平翻转
        int n = matrix.size();
        for(int i = 0;i < n/2;i++)
            swap(matrix[i],matrix[n-1-i]);
        
        for(int i = 0;i < n;i++)
        {
            for(int j = 0;j < n;j++)
            {
                cout << matrix[i][j] <<" ";
            }
            
            cout << endl;
        }
           
        //对角线翻转
        for(int i = 0;i < n;i++)
        {
            for(int j = i + 1;j < n;j++)
            {
                swap(matrix[i][j],matrix[j][i]);
            }
        }
    }
};

先水平翻转再沿对角线翻转,运行效率:

Runtime: 0 ms, faster than 100.00% of C++ online submissions for Rotate Image.
Memory Usage: 7 MB, less than 95.80% of C++ online submissions for Rotate Image.