leetcode#54. 螺旋矩阵(中等)

该博客介绍了LeetCode中的第54题,即如何按照顺时针螺旋顺序返回矩阵中的所有元素。主要内容包括题目描述、要点分析以及一种通过转置矩阵来解决的方法。在要点分析中,博主指出了判断转向条件的关键,以及如何避免重复访问元素。此外,还提及了一种简洁的解决方案,即不断转置并移除矩阵头部元素。
摘要由CSDN通过智能技术生成

题目描述

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
在这里插入图片描述
题目地址:https://leetcode-cn.com/problems/spiral-matrix/

要点分析

  1. 需要转变方向右两种情况,一是下一步超越矩阵边界,二是下一步到达已遍历的元素,排除掉这两种情况即可;
  2. 转变方向可以通过实现方向数组,对已遍历的的元素进行标记;
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        # 考虑空矩阵情况
        if not matrix: return []
        ans = []
        m,n = len(matrix),len(matrix[0])
        # 构建是否遍历的标记矩阵
        temp = [[False] * n for i in range(m)]
        # 从(0,0)出发
        r,c = 0,0
        # 初始化旋转方向
        di = 0
        # 初始化旋转矩阵
        # 两两组合分别代表向右,向下,向左,向上
        dr = [0,1,0,-1]
        dc = [1,0,-1,0]
        for x in range(m*n):
            ans.append(matrix[r][c])
            temp[r][c] = True
            nr, nc = r + dr[di], c + dc[di]
            # 若下一步不越界且未遍历过
            if 0 <= nr < m and 0 <= nc < n and not temp[nr][nc]:
                r,c = nr, nc
            else:
                di = (di+1)%4
                r, c = r + dr[di], c + dc[di]
                
        return ans
            

方法二:转置矩阵

在题解区看到的方法,太简洁了。
思路就是pop掉matrix的头后进行转置,重复操作。

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        res = []
        while matrix:
            res += matrix.pop(0)
            matrix = list(map(list, zip(*matrix)))[::-1]
        return res
  • zip()函数将可迭代的参数对应的元素打包成元组,返回元组组成的列表 。参数为矩阵时可理解为转置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值