51. 螺旋矩阵(Python)

更多精彩内容,请关注【力扣中等题】。

题目

难度:★★★☆☆
类型:矩阵,二维数组
方法:寻找规律

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例

示例 1
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例 2
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

解答

为了螺旋遍历矩阵,我们需要解决几个关键问题:

  1. 如何确定直线的方向?以及如何换向?

  2. 如何确定直线移动的边界?

这两个问题我们这样解决,每次走一步,设置方向偏移量di,dj分别为0,1,初始情况下向右方开始遍历,将每次遍历后的位置置空,是否需要换向,可以通过判断前方是否为矩阵边界或空来实现。右转弯换向操作为:di, dj = dj, -di,然后继续遍历即可。

class Solution:
    def spiralOrder(self, matrix):
        """
        :param matrix: List[List[int]]
        :return: List[int]
        """

        res, i, j, di, dj = [], 0, 0, 0, 1
        if matrix:
            for _ in range(len(matrix) * len(matrix[0])):
                res.append(matrix[i][j])
                matrix[i][j] = None
                next_step = matrix[(i + di) % len(matrix)][(j + dj) % len(matrix[0])]
                if next_step is None:
                    di, dj = dj, -di
                i += di
                j += dj
        return res

如有疑问或建议,欢迎评论区留言~

你可能感兴趣的:(51. 螺旋矩阵(Python))