Problem Definition:
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?Solution:
顺时针旋转90度,就是以表格(图片)中心为轴,所有坐标都做旋转。旋转中的坐标映射,用一个小例子来试试:
对一个3X3的表格,单元格的映射是这样的:
00-->02-->22-->20-->00
01-->12-->21-->10-->01
02-->22-->20-->00-->02
(最后一行这个变换跟第一行操作的是同一组元素,不会真的进行,只是为了表达单元格坐标见的关系。)
上图中第一二列,相邻近的子列是相同的,相远离的子列,相加得n-1.
再来看个大一点的例子:
00会跑到03的位置,03会跑到33的位置....下图标出了这样的一组单元格(蓝色填充):
01会跑到13的位置,13会跑到32的位置...这一组用红色表示:
02啥的同理,绿色表示:
如此一圈下来,外围的单元格都转完了,剩下里边一个2 x 2的表格。继续转....
循环地赋值,空间复杂度O(1)
1 # @param {integer[][]} matrix 2 # @return {void} Do not return anything, modify matrix in-place instead. 3 def rotate(matrix): 4 m=len(matrix) 5 if m<=1: 6 return 7 for i in range(m-1): 8 for j in range(i,m-1-i): 9 z=matrix[i][j]10 matrix[i][j]=matrix[m-1-j][i]11 matrix[m-1-j][i]=matrix[m-1-i][m-1-j]12 matrix[m-1-i][m-1-j]=matrix[j][m-1-i]13 matrix[j][m-1-i]=z