给你一个
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.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
解1 2021/9/8 O(n)
def spiralOrder(matrix: list) -> list:
# 题目限制了mxn,m和n>=1
'''
0 1 2 3
-------------
0 |1 2 3 4
1 |4 5 6 7
2 |7 8 9 3
→ ↓ ← ↑ 循环,直到填完n个数为止
同时更新上下左右四面墙就行了
比如,初始的时候,
zuo=0,you=3,shang=0,xia=2
→完了,shang+=1
↓完了,you-=1
←完了,xia-=1
↑完了,zuo+=1
'''
m=matrix.__len__()
n=matrix[0].__len__()
zuo=0
you=n-1
shang=0
xia=m-1
res=[]
i=0
num_nr=m*n
while i<num_nr:
# →
for x in range(zuo,you+1):
res.append(matrix[shang][x])
i+=1
if i==num_nr: return res
shang+=1
# ↓
for x in range(shang,xia+1):
res.append(matrix[x][you])
i+=1
if i == num_nr: return res
you-=1
# ←
for x in range(you,zuo-1,-1):
res.append(matrix[xia][x])
i+=1
if i == num_nr: return res
xia-=1
# ↑
for x in range(xia,shang-1,-1):
res.append(matrix[x][zuo])
i+=1
if i == num_nr: return res
zuo+=1
return res
if __name__ == '__main__':
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(spiralOrder(matrix))
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
print(spiralOrder(matrix))
matrix = [[1, 2], [5, 6], [8, 9]]
print(spiralOrder(matrix))
matrix = [[1, 2,3], [2,5, 6]]
print(spiralOrder(matrix))
matrix = [[1]]
print(spiralOrder(matrix))
matrix = [[1,2,3,3,4]]
print(spiralOrder(matrix))
matrix = [[1],[2],[3],[3],[4]]
print(spiralOrder(matrix))