BM98 螺旋矩阵(python)

题目

题目链接
给出一个矩阵,按顺时针螺旋顺序输出
例:
矩阵在这里插入图片描述

输出在这里插入图片描述

①一般递归解法

思路

对矩阵进行螺旋绕圈输出,相当于一层一层输出,如图所示:

在这里插入图片描述
可以得到递归解法:
设置dst数组保存螺旋遍历的结果

  • 若矩阵中没有元素了,退递归
  • 若矩阵只有1行,把这一行元素加入dst,退递归
  • 若矩阵只有1列,把这一列元素加入dst,退递归
  • 若矩阵形状>1行1列,把矩阵外层元素顺时针加入dst,对内层矩阵继续递归

顺时针取矩阵外圈

用了切片和列表生成式,也可以普通for循环
在这里插入图片描述

取内层矩阵

要取矩阵matrix的内层,可以用列表生成式:[a[1:-1] for a in matrix[1:-1]]

代码

class Solution:
    def rr(self, matrix, dst):
        # 为空
        if not matrix or not matrix[0]:
            return
        # 只有1行
        elif len(matrix) == 1:
            dst += matrix[0]
            return
        # 只有1列
        elif len(matrix[0]) == 1:
            dst += [matrix[i][0] for i in range(len(matrix))]
            return
        # >1行1列的情况,取外圈
        else:
            dst += matrix[0][:-1]
            dst += [matrix[i][-1] for i in range(len(matrix) - 1)]
            dst += matrix[-1][-1:0:-1]
            dst += [matrix[i][0] for i in range(len(matrix) - 1, 0, -1)]
        # 取数组的内层,继续递归
        self.rr([a[1:-1] for a in matrix[1:-1]], dst)

    def spiralOrder(self, matrix):
        dst = []
        self.rr(matrix, dst)
        return dst

②一种简单的python解法

参考:https://blog.nowcoder.net/n/9157db534a4945b1a3edd2b0c183a078?f=comment

思路

每次取矩阵的第一行,将矩阵剩下的部分逆时针旋转90度
此时剩下的部分的第一行即为原本下一次要输出的内容
在这里插入图片描述

用zip(*)转置矩阵

zip有2种用法,zip(matrix1,matrix2...)zip(*matrix)

zip()

zip(matrix1,matrix2...)的功能:把多个列表的元素按纵向对应位置打包,如果这多个列表不一样长,以最短的为准

如图有a,b两个列表:
在这里插入图片描述
对a,b进行zip,并转为list输出:
在这里插入图片描述
得到:
在这里插入图片描述

可以看出打包了(a[0],b[0])(a[1],b[1]),由于b比a短,a多出来的元素未被打包

打包后的二维矩阵和原矩阵是转置关系,且每一行的格式为元组

zip(*)

zip(*matrix)是zip()的逆操作,效果为把一个矩阵转置

例:
有一个矩阵mat,对mat进行zip(*)操作:
在这里插入图片描述
输出为mat的转置:
在这里插入图片描述

zip(*)和[::-1]实现矩阵逆时针旋转

由于矩阵转置相当于顺时针旋转了90°,想要实现逆时针旋转90°,可以:先转置,再对行进行倒序,即为逆时针旋转的效果

[::-1]

[::-1]是python切片的一种用法,python切片的格式为[开始位置:结束位置:步长],开始位置和结束位置缺省时默认为整个list,当步长为-1时表示倒序
所以[::-1]表示:将list倒序

用zip(*)和[::-1]实现矩阵逆时针旋转图示:
在这里插入图片描述

代码

class Solution:
    def spiralOrder(self , matrix):
        res=[]
        while matrix:
            # 取矩阵第一行
            res+=matrix[0]
            # 把矩阵剩下的部分逆时针旋转90度
            # 方法:取剩下的矩阵,先转置,再倒序
            matrix=list(zip(*matrix[1:]))[::-1]
        return res
逆时针输出n×n螺旋矩阵是一个经典的编程问题,它涉及到了数组操作、递归以及矩阵的动态构建。以下是生成一个逆时针螺旋矩阵的简单算法步骤: 1. 初始化一个空的二维数组,大小为n×n。 2. 定义四个变量:top(顶部索引),bottom(底部索引),left(左侧索引),right(右侧索引),它们分别表示当前行和列的边界。 3. 首先,从左上角(top, left)开始,将数字填充到矩阵中,然后依次向右、向下、向右上和向左上移动,直到到达右下角(bottom, right)。 4. 当到达右下角后,逐层反转方向:左上->上->右->右下->左。每一步都减少相应的行或列的跨度,同时更新对应的边界值。 5. 重复以上过程,直到所有的数字都填入矩阵。 下面是一个简单的Python示例: ```python def spiral(n): matrix = [[0] * n for _ in range(n)] top, bottom, left, right = 0, n - 1, 0, n - 1 direction = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 右上, 右下, 左下, 左上 while True: for dy, dx in direction: for i in range(left, right + 1): matrix[top][i] = i + top * n top += dy if top < bottom and left < right: for i in range(top + 1, bottom): matrix[i][right] = i + right * n right -= dx elif top < bottom: break else: continue if left < right: for i in range(right - 1, left - 1, -1): matrix[bottom][i] = i + bottom * n bottom -= dy if top < bottom: break for i in range(bottom - 1, top, -1): matrix[i][left] = i + left * n left += dx if left >= right: break return matrix # 示例 print(spiral(3)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值