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 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注