目录

0054:螺旋矩阵(★)

力扣第 54 题

题目

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

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

示例 2:

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

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

分析

考虑模拟过程:

  • 初始位置 <i,j>=(0,0),初始方向 <di,dj>=(0,1)
  • 到达边界位置则改变方向为 <dj,-di>
  • 为了方便,可以将走过的地方置 inf ,当 matrix[(i+di)%m][(j+dj)%n]==inf 即代表到达边界

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        m,n = len(matrix),len(matrix[0])
        i,j,di,dj = 0,0,0,1
        res = []
        for _ in range(m*n):
            res.append(matrix[i][j])
            matrix[i][j] = inf
            if matrix[(i+di)%m][(j+dj)%n]==inf:
                di,dj = dj,-di
            i,j = i+di,j+dj
        return res

32 ms