Python练习-LeetCode 第1篇 顺时针打印矩阵

Python练习-LeetCode 第1篇

  • 题目
  • 解题思路
  • 代码
  • 总结

题目

第一次使用LeetCode,感觉还挺不错的,在这里写简单的一个算法题题解:
剑指offer题之 顺时针打印矩阵

Python练习-LeetCode 第1篇 顺时针打印矩阵_第1张图片
还有英文版的,适合练一下英语,这里就不放了。

文章目录

  • 题目
  • 解题思路
  • 代码
  • 总结


解题思路

顺时针打印矩阵,也称为螺旋升天打印算法。
算法比较简单,我太菜,想不到什么特别简单的算法,大概思路如下:

#伪代码
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)

用图表示为下图:
每次遍历一条矩阵的边,遍历完了就跳出循环

Python练习-LeetCode 第1篇 顺时针打印矩阵_第2张图片

代码

在这里就不展示矩阵类和生成函数了,直接写循环的函数代码,如下所示:

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)
Python练习-LeetCode 第1篇 顺时针打印矩阵_第3张图片

而这样的话会导致矩阵四个角的位置会录入结果列表res两次。
所以为了避免这种情况需要做出一个调整。
当然也可以在第二个for循环中
的 t 改为 t + 1
都是一个意思,就不多说了。
Python练习-LeetCode 第1篇 顺时针打印矩阵_第4张图片

总结

总而言之,对于初学者而言,还是比较友好的。(对于我这种大三菜鸡)

你可能感兴趣的:(python,算法,数据结构,leetcode,列表)