标签:
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,不需要计算。另外注意的是每次交换其实只要操作一半数组。全部操作反而无效。
标签:
原文地址:http://www.cnblogs.com/sherylwang/p/5470943.html