给定一个包含 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]
解题思路:
首先顺时针读取矩阵最外围的元素;
接着从(1,1)开始遍历矩阵,开始判断元素“行走”的方向:上方和左侧元素为0,右侧元素不为0时,右行一格(走过的格子元素均为0,下同);上方和右侧元素为0,下方元素不为0时,下行一格;右侧和下方元素为0,左侧元素不为0时,左行一格;下方和左侧元素为0,上方元素不为0时,上行一格;当上下左右4个元素均为0时,跳出循环。
接着就是LeetCode最烦人的特殊情况的处理:矩阵为空,矩阵为1行,矩阵为1列,这些情况代码都写得很清楚;单独说一下,在读取完外围一圈元素时,判断一下:如果行数或列数为2,则直接返回。
代码:
class Solution:
def spiralOrder(self, matrix):
if len(matrix) == 0:
return []
width = len(matrix)
length = len(matrix[0])
num = []
if width == 1 :
return matrix[0]
if length == 1:
for j in range(width):
num.append(matrix[j][0])
return num
for x in range(0, length):
num.append(matrix[0][x])
matrix[0][x] = 0
for y in range(1, width):
num.append(matrix[y][length-1])
matrix[y][length-1] = 0
for x in range(length-2, -1 ,-1):
num.append(matrix[width-1][x])
matrix[width-1][x] = 0
for y in range(width-2, 0, -1):
num.append(matrix[y][0])
matrix[y][0] = 0
if length == 2 or width ==2:
return num
x, y = 1, 1
while True:
if matrix[x-1][y] == 0 and matrix[x][y-1] == 0 and matrix[x][y+1] != 0:
num.append(matrix[x][y])
matrix[x][y] = 0
y+=1
if matrix[x-1][y] == 0 and matrix[x][y+1] == 0 and matrix[x+1][y] != 0:
num.append(matrix[x][y])
matrix[x][y] = 0
x+=1
if matrix[x][y+1] == 0 and matrix[x+1][y] == 0 and matrix[x][y-1] != 0:
num.append(matrix[x][y])
matrix[x][y] = 0
y-=1
if matrix[x+1][y] == 0 and matrix[x][y-1] == 0 and matrix[x-1][y] != 0:
num.append(matrix[x][y])
matrix[x][y] = 0
x-=1
if matrix[x-1][y] == 0 and matrix[x][y-1] == 0 and matrix[x][y+1] == 0 and matrix[x+1][y] == 0:
num.append(matrix[x][y])
break
return num