输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[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、解题分析
打印分四个方向:左->右;上->下;右->左;下->上。有四个方向就是四个边界,left,right,top,bottom=0,len(matrix[0])-1,0,len(matrix);而且满足left<=right and top<=bottom;如果不满足这个情况就遍历结束。这每一个方向的变化是不同的,但是又有相似之处,下面以一一分解:①左->右;对于这个方向来说,二维矩阵的上边界减少1,其余不变。②上->下;对于这个方向来说二维矩阵的右边界减少1;因此①②遍历结束以这个二维矩阵的上边界加1和右边界减1。而在这个时候上边界要判断和下边界的大小,右边界要判断和左边界的大小。同理可得,左->右 和 下->上。是分别要判断和左右边界大小、上下边界大小。接下来代码说明:
class Solution:
def spiralOrder(self, matrix:[[int]]) -> [int]:
#如果矩阵为空,返回一个空列表
if not matrix:
return []
#定义上下左右四个边界
#这四个边界满足l=<r and t=<b 如果一旦不满足这个条件 循环结束退出,遍历结束
#等于的这个情况是只有一个元素的时候;左右边界就是相等的。
l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
while True:
#先从左往右打印,打印一行top就增加1,第二轮转过来肯定到第三行去了
for i in range(l, r + 1):
res.append(matrix[t][i])
t += 1
#如果top都大于bottom 说明循环就结束了
if t > b:
break
#从上往下打印,当然横坐标是top+1开始,top层已经遍历过了
for i in range(t, b + 1):
res.append(matrix[i][r])
#遍历完右边这一列,右边的边界不得不减1
r -= 1
#如果左边界大于右边界循环结束
if l > r:
break
#从右往左得起始坐标当然是r-1,因为右边那一列已经遍历结束了
for i in range(r, l - 1, -1):
res.append(matrix[b][i])
#遍历完下边得一层bottom自然而然要减去1
b -= 1
#再次判断top和bottom的大小关系
if t > b:
break
#从下往上,起始坐标当然是b-1.bottom已经遍历结束
for i in range(b, t - 1, -1):
res.append(matrix[i][l])
#左侧遍历完l就要往右移动一下
l += 1
#如果左边大于右边那就结束遍历
if l > r:
break
return res
#奇技淫巧
res = []
while matrix:
res.extend(matrix.pop(0))
matrix = list(zip(*matrix))[::-1]
return res