# -*- coding:utf-8 -*-
class Solution(object):
def spiralOrder(self, matrix):
""":typematrix: List[List[int]]:rtype: List[int]
"""ret = []
if matrix == []:
return ret
ret.extend(matrix[0]) # 上侧
# 生成一个反向迭代器,比如1,2,3生成3 2 1
new = [reversed(i) for i in matrix[1:]]
if new == []:
return ret
# zip用来解压迭代器 相当于把new生成的迭代器依次遍历,达到一个类似“逆时针旋转”的样子。
r = self.spiralOrder([i for i in zip(*new)])
ret.extend(r)
return ret
if __name__ == '__main__':
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
print(Solution().spiralOrder(matrix))
思路:这道题刚一开始我是打算类似于前面有一道题Z字抖动一样,靠下标找结果,但是发现一个这个做法,就真的强,写下来学习一下。
因为是顺时针找元素,相当于我们不断的取矩阵第一行然后逆时针旋转矩阵,因此这个方法采用对矩阵(二维列表)进行操作。首先取第一行,然后生成一个反向迭代器,最后由zip(*)处理这个迭代器,达到了旋转的效果。
举个例子:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
这个矩阵首先我们取了第一行:
[
[5, 6, 7, 8],
[9, 10, 11, 12]
]
这时候生成一个反向迭代器列表,在这个迭代器中你可以理解成这样,只不过它还是个迭代器,并不是列表
[
[8, 7, 6, 8],
[12, 11, 10, 9]
]
最后我们通过zip(*)遍历这个迭代器。
[
[8,12],
[7,11],
[6,10],
[8,9]
]
这时候我们再取第一行,是不是就步入正轨了?
这道题学到了不少,首先这个思路我是没想到的,再一个是reversed()这个反向迭代器和zip(*)我还是第一次遇到。