题目
第一次使用LeetCode,感觉还挺不错的,在这里写简单的一个算法题题解:
剑指offer题之 顺时针打印矩阵
还有英文版的,适合练一下英语,这里就不放了。
解题思路
顺时针打印矩阵,也称为螺旋升天打印算法。
算法比较简单,我太菜,想不到什么特别简单的算法,大概思路如下:
#伪代码
top = 0
left = 0
bottom = len(矩阵行) -1
right = len(矩阵列) -1
res = []
while true:
for 遍历矩阵顶部
top++
if top>bottom: break
for 遍历矩阵右边
right--
if left>right: break
for 遍历矩阵底部
bottom --
if top>bottom: break
for 遍历矩阵左部
left ++
if left>right: break
print(res)
用图表示为下图:
每次遍历一条矩阵的边,遍历完了就跳出循环
代码
在这里就不展示矩阵类和生成函数了,直接写循环的函数代码,如下所示:
class Solution:
def spiralOrder(self, matrix:[[int]]) -> [int]:
if len(matrix) ==0:
return []
l = 0 #左边
r = len(matrix[0]) - 1 #右边 这里需要减一
t = 0 #上边
b = len(matrix) - 1 #下边
res = [] #结果列表
while True:
for i in range(l, r + 1):
res.append(matrix[t][i]) # left to right
t += 1
if t > b:
break
for i in range(t, b + 1):
res.append(matrix[i][r]) # top to bottom
r -= 1
if l > r:
break
for i in range(r, l - 1, -1):
res.append(matrix[b][i]) # right to left
b -= 1
if t > b:
break
for i in range(b, t - 1, -1):
res.append(matrix[i][l]) # bottom to top
l += 1
if l > r:
break
return res
有的小伙伴要问了,在开始的定义的时候,为什么要减一呢?
好问题!
因为在后面的while 循环中,可以很清楚的看到,如果不减一,那么为了正常输出,在圈出的位置要改为r
(r+1 =》 r)
而这样的话会导致矩阵四个角的位置会录入结果列表res两次。
所以为了避免这种情况需要做出一个调整。
当然也可以在第二个for循环中
的 t 改为 t + 1
都是一个意思,就不多说了。
总结
总而言之,对于初学者而言,还是比较友好的。(对于我这种大三菜鸡)