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

Python练习-LeetCode 第1篇

题目

第一次使用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
都是一个意思,就不多说了。
在这里插入图片描述

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值