0
点赞
收藏
分享

微信扫一扫

leetcode48——旋转图像

流沙雨帘 2022-04-27 阅读 61
leetcode

旋转图像


在这里插入图片描述

辅助矩阵

我们通过分析示例可以看出,转换后的矩阵和转换前的矩阵有如下关系
在这里插入图片描述
我们可以得出对于矩阵中第i行j列的元素,在旋转后出现在倒数第i列第j行的位置,我们可以得到如下关系。

所以我们可以使用一个辅助矩阵来进行旋转。
我们就会有如下代码:

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

    }
};

但是,题目要求我们必须原地旋转也就是意味着不能使用辅助矩阵。

原地旋转

在辅助矩阵中有matrix_new[j][n - i - 1] = matrix[i][j];这一公式,如果我们直接将matrix[i][j]放到matrix[j][n - i - 1] 中,原矩阵自中的matrix[j][n - i - 1]位置的值将会被原matrix[i][j]的值替换,这样在进行下次旋转的时候matrix[j][n - i - 1]位置的值就不是原来的值,就会出现错误,所以我们需要使用一个临时temp变量来暂存原matrix[j][n - i - 1]位置的值,这样我们在下次旋转的时候还可以得到原matrix[j][n - i - 1]位置的值(temp)。就会有如下公式:
在这里插入图片描述
那么matrix[col][n−row−1]的值会旋转到哪里呢?带入关键公式中
在这里插入图片描述
得matrix[n−row−1][n−col−1]=matrix[col][n−row−1],这样直接赋值还是会覆盖掉原matrix[n−row−1][n−col−1]中的值,因此还是需要临时值进行存储原matrix[n−row−1][n−col−1]的值。
在这里插入图片描述
循环带入得
在这里插入图片描述
matrix[n−col−1][row] 经过旋转操作之后回到哪个位置呢?
带入关键公式得matrix[row][col]=matrix[n−col−1][row],所以我们又回到了起始位置。
所以就有如下图:
在这里插入图片描述
因此我们使用临时变量来进行辅助旋转。

在这里插入图片描述

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 - j - 1][i];
                matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
                matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
                matrix[j][n - i - 1] = temp;
            }
        }
    }
};

用翻转代替旋转

根据示例2进行讲解
首先我们通过水平轴翻转得:
在这里插入图片描述
然后在根据主对角线进行翻转得:
在这里插入图片描述
有如下公式:
在这里插入图片描述

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; ++j) {
                swap(matrix[i][j], matrix[n - i - 1][j]);
            }
        }
        // 主对角线翻转
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
                swap(matrix[i][j], matrix[j][i]);
            }
        }
    }
};

举报

相关推荐

0 条评论