问题描述:
给定一个包含m x n
个元素的矩阵(m
行,n
列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 :
输入:
[[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)因为从第一个位置开始,顺时针螺旋输出,进一步可以理解为,一层一层的处理。
(2)所以,就可以一层一层向里处理,依次是,最上层
、最右层
、最下层
、最左层
,即这一圈处理完毕,循环进入下一个内圈,直到结束。其中需要注意的时间,最后剩下的可能为一行,或者一列,这时,要单独判断。
(3)需要注意的地方就是,各种边界问题,比较繁琐,要细心即可,其中代码参考了他人提交的优秀代码。
Python3实现:
class Solution:
def spiralOrder(self, matrix):
if matrix == []: return []
top = 0 # 上边
bottom = len(matrix) - 1 # 下边
left = 0 # 左边
right = len(matrix[0]) - 1 # 右边
res = []
while top < bottom and left < right:
res += matrix[top][left:right + 1] # 输出最上面一行数据
for x in range(top + 1, bottom): # 输出最右边一列数据
res.append(matrix[x][right])
res += matrix[bottom][left:right + 1][::-1] # 输出最下面一行数据
for x in range(bottom - 1, top, -1): # 输出最左边一列数据
res.append(matrix[x][left])
top, bottom, left, right = top + 1, bottom - 1, left + 1, right - 1 # 四个边界,分别向内部移动一个位置
if top == bottom: # 如果最后剩下一行数据
res += matrix[top][left:right + 1]
elif left == right: # 如果最后剩下一列数据
for x in range(top, bottom + 1):
res.append(matrix[x][right])
return res
if __name__ == '__main__':
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
print(Solution().spiralOrder(matrix))
声明: 总结学习,有问题或不妥之处,可以批评指正哦。