题目:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
解题思路:
每次完成一个顺时针旋转就会重新开始下一个顺时针旋转,其中的上下左右都会向内缩小一个距离。那么就需要定好上下左右的边界,之后逐步迭代直到上下左右全部遍历完为0。
注意:边界条件的处理。
1、如果列表不存在或者为空的特殊情况要直接返回[]
2、剩下最后一行或者一竖需要遍历,四个遍历步骤中前两个步骤完成之后就已经完成了,再执行后俩步骤会导致重复,所以需要额外判断下是否已经是最后一行或者一竖了。
核心代码以及细节:
python
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
# 边界条件,如果列表不存在或者为空,那么可以直接返回
if not matrix or not matrix[0]:
return []
# 初始处理:定好上下左右的边界,每次遍历完可以修改边界
left,right = 0,len(matrix[0])-1
top,bottom=0,len(matrix)-1
result = []
# 按一个顺时针为周期来进行遍历,其中左右上下之间的大小关系要满足:
while left <= right and top <= bottom:
# 先从最上面行top遍历从左到右
for i in range(left,right+1):
result.append(matrix[top][i])
top += 1
# 再从最右边竖right遍历从上到下
for i in range(top,bottom+1):
result.append(matrix[i][right])
right-=1
# 再从最下面行bottom遍历从右到左
# 边界条件:如果剩余最后一条已经被遍历完了,这里就不应该再重复遍历了,此处的bottom要大于top
if bottom >= top:
for i in range(right,left-1,-1):
result.append(matrix[bottom][i])
bottom-=1
# 最后从最左边竖left遍历从下到上
# 边界条件,同上
if left <= right:
for i in range(bottom,top-1,-1):
result.append(matrix[i][left])
left+=1
return result