前往此题

模拟法

我们可以模拟向内环绕的过程依次填入元素到数组中即可。

  1. 生成一个m×n的矩阵tar,表示内旋过程的总步数
  2. l,r,t,b代表矩阵的上下左右边界,边界会随着内旋的过程改变
  3. num代表当前步数,开始循环后按照从左至右、从上至下、从右至左、从下至上的顺序执行,每次执行填入数据后将num+=1,然后更新边界
  4. 最后注意num在循环过程中不能大于矩阵大小tar

![](…/images/2021-12-29 3.59.24.png)

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        l, r, t, b = 0, len(matrix[0]) - 1, 0, len(matrix) - 1
        res, num, tar = [], 1, len(matrix[0]) * len(matrix)

        while num <= tar:
            for i in range(l, r + 1):
                if num > tar: break
                res.append(matrix[t][i])
                num += 1
            t += 1

            for i in range(t, b + 1):
                if num > tar: break
                res.append(matrix[i][r])
                num += 1
            r -= 1

            for i in range(r, l - 1, -1):
                if num > tar: break
                res.append(matrix[b][i])
                num += 1
            b -= 1

            for i in range(b, t - 1, -1):
                if num > tar: break
                res.append(matrix[i][l])
                num += 1
            l += 1
        return res