54 螺旋矩阵

本文介绍了一种螺旋遍历二维矩阵的方法,并提供了详细的Python实现代码。通过定义边界判断、已访问点记录及方向变换等关键步骤,实现了从外到内、按层螺旋遍历矩阵的功能。

这个题看题解,官方题解比较符合我的思路。简单来说就是莽过去,思路和遍历顺序一样,需要记录 已访问点,设置遍历长度、边界判断、方向

#遍历长度
m,n = len(arr),len(arr[0)]
total = m*n
#已访问点
vis = [[0]*n for _ in range(m)]
#边界判断
def area(i,j,m,n):
   if m>i>=0 and 0<=j<n:
       return True
   return False

根据边界和已访问点判断是否改变方向,满足条件时方向指针 index +1

#方向
direct = [[0,1],[1,0],[0,-1],[-1,0]] #l,d,l,u

if not area(i1,j1,m,n) or vis[i1][j1]: #若超出边界或已经访问,则需改变方向
   index = (index+1)%4 #改变方向,周期为4

最后打印结果,整体代码如下:

def spiralOrder(self, mat: List[List[int]]) -> List[int]:
        if not mat: return mat

        def area(i,j,m,n):
            if m>i>=0 and 0<=j<n:
                return True
            return False

        m,n = len(mat),len(mat[0])
        vis = [[0]* n for _ in range(m)]
        total = m*n
        res = []
        direct = [[0,1],[1,0],[0,-1],[-1,0]] #l,d,l,u
        
        i,j,index = 0,0,0
        for k in range(total):
            res.append(mat[i][j])
            vis[i][j] = 1 #已访问
            #判断以当前方向进行时下一个点是否符合条件,若超出边界或已经访问,则需改变方向
            i1,j1 = i+direct[index][0],j+direct[index][1]
            if not(area(i1,j1,m,n) and not vis[i1][j1]): 
                index = (index+1)%4 #改变方向
           #以当前方向遍历     
            i += direct[index][0]
            j += direct[index][1]
        return res        

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值