剑指Offer29-顺时针打印矩阵
每日几道leetcode刷刷题!
JZ-Offer29
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
代码
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:
return []
n = len(matrix) #行数
m = len(matrix[0]) #列数
up, down, left, right = 0, n-1, 0, m-1
ans = []
while True:
#按顺时针的方向,往右-下-左-上
#从左往右
for i in range(left, right + 1):
ans.append(matrix[up][i])
up += 1 #遍历完一层,顶部+1
if up > down:break
#从上往下
for i in range(up, down + 1):
ans.append(matrix[i][right])
right -= 1
if right < left:break
#从右往左,注意这里是left-1,以及-1表示反方向的遍历
for i in range(right, left-1, -1):
ans.append(matrix[down][i])
down -= 1
if up > down:break
#从下往上
for i in range(down, up - 1, -1):
ans.append(matrix[i][left])
left += 1
if right < left:break
return ans
总结
也没什么算法,就按顺序来遍历,同时应当注意for 循环中的范围,自己画一个图会比较好理解。