【Leetcode 数组】 螺旋矩阵(54)
题目
给定一个包含 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]
解答
像搜索一样,定义一个表示上下左右移动的数组。可代码量,哭辽...
z = [
[0, 1], # 右
[1, 0], # 下
[0, -1], # 左
[-1, 0] # 上
]
2020.5.30更新:不用定义移动数组,直接计算就OK。
(2020.5.30更新)代码实现:
class Solution:
# Time: O(N),N为数值个数
def spiralOrder(self, a):
if not a:
return []
X, Y = len(a), len(a[0])
x, y = 0, 0
l = []
while len(l) < X*Y:
if a[x][y] != float('inf'):
l.append(a[x][y])
a[x][y] = float('inf')
while y+1 < Y and a[x][y+1] != float('inf'): # 向右
y += 1
l.append(a[x][y])
a[x][y] = float('inf')
while x+1 < X and a[x+1][y] != float('inf'): # 向下
x += 1
l.append(a[x][y])
a[x][y] = float('inf')
while y-1 >= 0 and a[x][y-1] != float('inf'): # 向左
y -= 1
l.append(a[x][y])
a[x][y] = float('inf')
while x-1 >= 0 and a[x-1][y] != float('inf'): # 向上
x -= 1
l.append(a[x][y])
a[x][y] = float('inf')
return l
s = Solution()
ans = s.spiralOrder([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
])
print(ans)
# [1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]