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?

题目要求顺时针翻转一个二维矩阵,简单直接的思路是从里向外,以矩阵中心为中心,一瓣一瓣旋转。但是这样需要借助temp作为中间存储,规则也比较麻烦。一个比较tricky的思路是对矩阵进行两次对称翻转。一种翻转方法是,先沿着副对角线翻转一次,之后再上下翻转一次。另外一种是先上下翻转,之后再沿主对角线翻转。(主对角线是指 左下到右上,副对角线是指左上到右下)。方法一示意图如下:

方法二示意图如下:

     

第一种解法代码如下:

class Solution(object):
    def rotate(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: void Do not return anything, modify matrix in-place instead.
        """
        n = len(matrix)
        for i in range(n-1):
            for j in range(n-1-i):
                matrix[n-1-j][n-1-i],matrix[i][j] = matrix[i][j],matrix[n-1-j][n-1-i]
        matrix.reverse()
        return 

第二种代码实现如下:

class Solution(object):
    def rotate(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: void Do not return anything, modify matrix in-place instead.
        """
        n = len(matrix)
        matrix.reverse() 
        
        for i in range(0,n-1):
            for j in range(i+1,n):
                matrix[i][j],matrix[j][i]=matrix[j][i],matrix[i][j]
        return 

时间复杂度都是O(n^2),空间复杂度O(1)。但是可以发现沿主对角线翻转比沿辅对角线翻转要方便很多,只需要交换index,不需要计算。另外注意的是每次交换其实只要操作一半数组。全部操作反而无效。

 

posted on 2016-05-08 16:52  Sheryl Wang  阅读(311)  评论(0编辑  收藏  举报

导航