矩阵旋转
在leetcode上刷到一道 旋转图像 的题,自己苦思冥想未果之后去百度搜索了一下,
被 一个 Python答案给惊到了。。。
原题链接: 点击进入
Python代码实现:
def rotate(self, matrix):
matrix[:] = map(list,zip(*matrix[::-1]))
一行解决这道题,虽然用Python 一句话解决过好几个简单题,但是这道题的答案我是真的服了!
思路分析:
若这个是原矩阵:
[1,2,3]
[4,5,6]
[7,8,9]
顺时针翻转后 成:
[7,4,1]
[8,5,2]
[9,6,3]
1.首先我们考虑一下怎么将矩阵顺时针旋转90°呢?
第一种方法是:
- 先将矩阵沿中间线上下翻转得到:
[7,8,9]
[4,5,6]
[1,2,3]
[7,4,1]
[8,5,2]
[9,6,3]
第二种方法是:
- 先将矩阵做转置处理:
[1,4,7]
[2,5,8]
[3,6,9]
- 然后做沿中间线左右翻转:
[7,4,1]
[8,5,2]
[9,6,3]
2.用Python如何实现呢?
- Python可以用第一种方法,先上下翻转,再做转置。
- 上下翻转怎么做?这就用到了,列表的切片。
matrix[::-1]
- 如何实现矩阵转置呢?
map(list,zip(*matrix))
与 zip 相反,*zipped 可理解为解压,返回二维矩阵式,zip返回的是元组组成的列表,由map将里面的元组全部进行 list 处理后,()—> [ ],
[ (1, 2, 3), [ [1, 2, 3],
(4, 5, 6),-----------> [4, 5, 6],
(7, 8, 9) ] [7, 8, 9] ]
所以就有了这一句精湛的代码:
matrix[:] = map(list,zip(*matrix[::-1]))
若是矩阵逆时针旋转90°,就是上面方法相反,
- 1.先转置 ,后上下翻转。
- 2.先左右翻转,再做转置。
下面是先转置,后翻转的代码:
matrix[:] = map(list,zip(*matrix))[::-1]