No.48 旋转图像

给定一个 n×n 的二维矩阵表示一个图像。

将图像顺时针旋转 90 度。

说明:

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

示例 1:

    给定 matrix =
    [
        [1,2,3],
        [4,5,6],
        [7,8,9]
    ],

    原地旋转输入矩阵,使其变为:
    [
        [7,4,1],
        [8,5,2],
        [9,6,3]
    ]

示例 2:

    给定 matrix =
    [
        [ 5, 1, 9,11],
        [ 2, 4, 8,10],
        [13, 3, 6, 7],
        [15,14,12,16]
    ],

    原地旋转输入矩阵,使其变为:
    [
        [15,13, 2, 5],
        [14, 3, 4, 1],
        [12, 6, 8, 9],
        [16, 7,10,11]
    ]

结果

res

思路

这一题只要找对了思路,就非常的简单。

一开始,我是想使用洋葱循环法来实现的,不过,C++这个语言不像 python,思路越是复杂往往就意味着代码量会呈几何倍增加。

所以,毫无疑问,洋葱循环是可以实现的,但是我比较懒。

于是想换一个思路。这一题的 tag 是数学,那么,如何从数学的角度来解决这个问题呢?

学过线性代数的应该还是有些印象的,矩阵旋转 90°,可以通过转置和翻转来达成相同的目的。这样一来,代码量无疑就简化了很多了。(洋葱法我大概构想了一下,会用到一个三重的 for 循环。。。)

这也是一个很浅显的道理,做事情不要总想着一蹴而就,换个角度,找对跳板,往往能够事半功倍

代码

void rotate(vector<vector<int>>& matrix) {
    int len = matrix.size();
    for(int i = 0 ; i < len ; i++){
        for(int j = 0; j < i; j++){
            swap(matrix[i][j],matrix[j][i]);
        }
    }
    for(int i = 0 ; i < len ; i++){
        reverse(matrix[i].begin(),matrix[i].end());
    }
}

后记

附上 5 月份以来的提交记录。
一天提交 12 次是真的疯狂啊。。。不知道这一次的刷题能够坚持多久呢?

p1

p2