给你一个 m 行 n 列的矩阵 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.lengthn == matrix[i].length1 <= m, n <= 10-100 <= matrix[i][j] <= 100
python
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
left,right,top,below=0,len(matrix[0])-1,0,len(matrix)-1
res=[]
while True:
for i in range(left,right+1): res.append(matrix[top][i])
top+=1
if top>below: break
for i in range(top,below+1): res.append(matrix[i][right])
right-=1
if left>right: break
for i in range(right,left-1,-1): res.append(matrix[below][i])
below-=1
if top>below: break
for i in range(below,top-1,-1): res.append(matrix[i][left])
left+=1
if left>right: break
return res
主要思想是设立上下左右四个边界,根据边界打印,打印完之后边界向内收缩1,表示已打印,如果边界相遇说明打印已完成。
首先在第一行开始从左到右打印,打印完第一行之后,上边界下移,也就是top加一,然后从上边界开始从上到下打印,打印完后右边界左移,然后从右边界从右到左打印,下边界上移,然后从下边界从下到上打印,一直如此循环。
打印行的时候只需要看上边界是否大于下边界,如果大于就退出,表示打印完了;同样打印列的时候看左边界是否大于右边界,大于就退出。
模拟过程:
假设矩阵是 3行3列:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
初始:l=0, r=2, t=0, b=2
第一轮循环:
-
从左到右:
res.append(matrix[0][0..2])→[1,2,3] -
t += 1→t=1 -
从上到下:
res.append(matrix[1..2][2])→[1,2,3,6,9] -
r -= 1→r=1 -
从右到左:
res.append(matrix[2][1..0])→[1,2,3,6,9,8,7] -
b -= 1→b=1 -
从下到上:
res.append(matrix[1..0][0])→[1,2,3,6,9,8,7,4] -
l += 1→l=1
此时边界:l=1, r=1, t=1, b=1
第二轮循环开始:
-
从左到右:
res.append(matrix[1][1..1])→[1,2,3,6,9,8,7,4,5] -
t += 1→t=2 -
检查
if t > b: break-
现在
t=2,b=1 -
2 > 1成立 ✅ -
break 退出循环
-