# \[54]\[中等] 螺旋矩阵

## 题目描述

[54. 螺旋矩阵](https://leetcode-cn.com/problems/spiral-matrix/) [剑指 Offer 29. 顺时针打印矩阵](https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/) [59. 螺旋矩阵 II](https://leetcode-cn.com/problems/spiral-matrix-ii/)

给定一个包含 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]
```

## 解题思路

[Spiral Matrix II （模拟法，设定边界，代码简短清晰）](https://leetcode-cn.com/problems/spiral-matrix-ii/solution/spiral-matrix-ii-mo-ni-fa-she-ding-bian-jie-qing-x/)

上面这种思路, 边界清晰. 外层循环每次走一圈, 循环内部, 依次循环顶部, 右部, 底部, 左部, 整个过程判断是否收集了足够数量的元素, 收集到足够元素后停止.

```python
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if len(matrix) == 0:
            return []
        n, m = len(matrix), len(matrix[0])
        num_total, res = n * m, []
        left, right, top, bottom = 0, m - 1, 0, n - 1
        while len(res) < num_total:
            if len(res) < num_total:
                for j in range(left, right + 1):
                    res.append(matrix[top][j])
                top += 1

            if len(res) < num_total:
                for i in range(top, bottom + 1):
                    res.append(matrix[i][right])
                right -= 1

            if len(res) < num_total:
                for j in range(right, left - 1, -1):
                    res.append(matrix[bottom][j])
                bottom -= 1

            if len(res) < num_total:
                for i in range(bottom, top - 1, -1):
                    res.append(matrix[i][left])
                left += 1
        return res
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blessbingo.gitbook.io/garnet/suan-fa/shu-zu/54-luo-xuan-ju-zhen.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
