1. 程式人生 > >【LeetCode】【Python題解】Rotate Image

【LeetCode】【Python題解】Rotate Image

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up:

Could you do this in-place?

我的解法非常簡潔,就用了一行程式碼,就是將給定的matrix重新整合,生成了一個新的matrix返回,所以並不是in-place的解法,但優點是十分的簡潔,賞心悅目!

class Solution:
    # @param matrix, a list of lists of integers
    # @return a list of lists of integers
    def rotate(self, matrix):
        return map(lambda x:map(lambda y:y.pop(0),matrix[::-1]),range(len(matrix)))

再分享一個看到的非常帥的解法,這個演算法就是in-place的了
#include <algorithm>

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

乍一看非常難懂,就感覺只是以矩陣的對角線為軸交換了兩邊的畫素點。其實不是。非常關鍵的一步是reverse()函式,它將matrix翻轉了。如果你在紙上寫一個nxn的矩陣(反正我是寫下來才明白的),reverse之後相當於是把紙翻轉過來,而且不是沿長邊翻轉,而是沿短邊翻轉(就是不是翻書那種翻轉,而是縱向從底部向上的那種翻轉),這樣翻轉之後最底部一行自然就成了最頂部一行。

第二步就是swap對角線兩側的元素,這樣又是一次翻轉,這次翻轉更復雜一些,是沿矩陣對角線的一次翻轉(也可以說是沿紙的對角線)

這時你會發現其實這就是把紙順時針旋轉了90度。