题目
给定一个包含 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] # 上
]
代码实现:
class Solution:
# Time: O(N),N为数值个数
def spiralOrder(self, matrix):
if not matrix:
return []
ans = []
Y, X = len(matrix[0]), len(matrix)
z = [
[0, 1], # 右
[1, 0], # 下
[0, -1], # 左
[-1, 0] # 上
]
x = y = 0
while len(ans) != X * Y:
if matrix[x][y] != float('-inf'):
ans.append(matrix[x][y])
matrix[x][y] = float('-inf')
while x + z[0][0] < X and y + z[0][1] < Y and matrix[x + z[0][0]][y + z[0][1]] != float('-inf'): # 向右
x = x + z[0][0]
y = y + z[0][1]
if matrix[x][y] != float('-inf'):
ans.append(matrix[x][y])
matrix[x][y] = float('-inf')
while x + z[1][0] < X and y + z[1][1] < Y and matrix[x + z[1][0]][y + z[1][1]] != float('-inf'): # 向下
x = x + z[1][0]
y = y + z[1][1]
if matrix[x][y] != float('-inf'):
ans.append(matrix[x][y])
matrix[x][y] = float('-inf')
while x + z[2][0] < X and y + z[2][1] < Y and matrix[x + z[2][0]][y + z[2][1]] != float('-inf'): # 向左
x = x + z[2][0]
y = y + z[2][1]
if matrix[x][y] != float('-inf'):
ans.append(matrix[x][y])
matrix[x][y] = float('-inf')
while x + z[3][0] < X and y + z[3][1] < Y and matrix[x + z[3][0]][y + z[3][1]] != float('-inf'): # 向上
x = x + z[3][0]
y = y + z[3][1]
if matrix[x][y] != float('-inf'):
ans.append(matrix[x][y])
matrix[x][y] = float('-inf')
return ans
s = Solution()
print(s.spiralOrder([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]))
# [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]