https://leetcode-cn.com/problems/spiral-matrix/
# -*- coding:utf-8 -*- class Solution(object): def spiralOrder(self, matrix): """ :type matrix: 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(*)我还是第一次遇到。
0 条评论