LeetCode48.旋转图像(矩阵)

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

将图像顺时针旋转 90 度。

说明:

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

思路1.

先将对应的行swap,然后转置。这个思路是最清晰的。

思路2.

将矩阵分成不同层:

如这个图,第一层是该4x4矩阵的外围。

第二层是4x4矩阵的内围的2x2矩阵。

分不同层,对每一层分别旋转90度。

对某一层来说,以图中第一层为例子:

一层的旋转实际上就是5与它对应的11,16,15之间旋转;1 10 12 13之间旋转;9 7 14 2之间旋转。

对5来说,只要不断swap(p(0,0),p(0,3); swap(p(0,0),p(3,3)); swap(p(0,0),p(3,0))即可。

而以某个点来说,与之对应的三个点的关系为:

p(i,j)

p1(j,n-i-1)

p2(n-i-1,n-j-1)

p3(n-j-1,i)

n是最外层的边长,而不是当前层的长度,如第二层时,这个关系里n也取4.

这个规律的来由:

p为(i,j)

对p1来说,它说将p顺时针旋转后的相邻点。

p的i的意义为,它所在的最顶上面的行的距离,现在因为旋转90度了,旋转90度代表行变为了列,列变为行,因此这个新的点p1所在列与最顶边的列的距离就是p的i。

举个例子,以图中4为例,4的坐标为(1,1).4的第一个1的意义代表,4与矩阵的第一行间的差距;现在因为旋转,4应该转到8的位置,因为旋转的缘故,第一行也会跟着旋转,矩阵的第一行变味了新矩阵的第四列,因此原来4与第一行的差距变为了新位置p1与第四列的差距。

所以p1的列为最后一列的索引减去(原来行差),也就是n-1-(i)。

同理,p的j的意义为它所在列里最左侧列的距离,因为旋转90度,列变为行,则现在应该是与最顶上的行的距离。

则p1的行为原来p的j

所以p1(j,n-1-i)。

而p2可以将p1视作p,按上面p1与p的关系来推导p2与p1的关系。

p3也是如此

其他分析类似。

原文地址:https://www.cnblogs.com/lxy-xf/p/11098502.html