每日一题(2022-01-18):旋转图像

每日一题(2022-01-18):旋转图像

来源:力扣
难度:中等
题目:48. 旋转图像

题目详情

原题截图.png

题解思路

很经典的一道题目!
最简单的思路就是使用辅助数组,将旋转后的结果拷贝的新数组中,然后再拷贝回去,但是由于题目中要求原地旋转图像,所以这种方法就舍弃了;
第二种思路就是找规律,通过分析转化为数学问题,虽然可以做到原地旋转,但是由于分析过程较为复杂,在面试笔试或者比赛中很难说能有这么多时间去做推导(对于本人自身来说),但是这并不代表我们可以死记硬背,力扣官方题解二讲得很好,在此不作赘述;
最后一种思路就比较巧妙了,核心思想就是用多次翻转代替旋转,虽然代码层面的操作相似,但是理解起来简单:对于顺时针旋转90°的情况,我们可以先水平翻转,然后再沿左上-右下主对角线翻转,就能达到相同的效果;

代码结果

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        const int iMatrixSize = matrix.size();

        // 水平翻转
        for (int i = 0; i < iMatrixSize / 2; ++i)
            for (int j = 0; j < iMatrixSize; ++j)
                swap(matrix[i][j], matrix[iMatrixSize - i - 1][j]);

        // 左上-右下 对角线翻转
        for (int i = 0; i < iMatrixSize; ++i)
            for (int j = 0; j < i; ++j)
                swap(matrix[i][j], matrix[j][i]);
    }
};

运行结果.png