力扣算法之 螺旋矩阵 附python代码(超超级详细 )

2023-10-31

1.题目描述:给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素

2.运行示例:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

3.解题思路
题意要求我们螺旋向内遍历矩阵,需要考虑以下几个问题:

3.1. 起始位置
3.2. 移动方向
3.3. 边界
3.4. 结束条件

3.1. 起始位置
螺旋矩阵的遍历起点是矩阵的左上角,也就是 (0, 0) 位置。

3.2. 移动方向
起始位置的下一个移动方向是向右。在遍历的过程中,移动方向是固定的:

右 → ,下↓,左←,上↑
右→,下↓,左←,上↑

移动方向是按照上面的顺序循环进行的。每次当移动到了边界,才会更改方向。但边界并不是固定的,请看下面分析。

3.3. 边界
本题的边界是最大的难点,因为是随着遍历的过程而变化的。螺旋遍历的时候,已经遍历的数字不能再次遍历,所以边界会越来越小。

规则是:如果当前行(列)遍历结束之后,就需要把这一行(列)的边界向内移动一格。

以下面的图为例, up, down, left, right 分别表示四个方向的边界,初始时分别指向矩阵的四个边界。如果我们把第一行遍历结束(遍历到了右边界),此时需要修改新的移动方向为向下、并且把上边界 up 下移一格,即从 旧 up 位置移动到 新 up 位置。

当绕了一圈后,从下向上走到 新up 边界的时候,此时需要修改新的移动方向为向右、并且把左边界 left 下移一格,即从 旧 left 位置移动到 新 left 位置。

由此可见,根据维护的四个方向的边界,就知道什么时候更改移动方向了。

3.4. 结束条件
螺旋遍历的结束条件是所有的位置都被遍历到。

4.代码:

Python

class Solution(object):
#定义一个名为Solution的类。
    def spiralOrder(self, matrix):#定义一个名为spiralOrder的函数它有两个参数self和matrix
        #matrix:二维列表
        #self:类的实例本身
        if not matrix or not matrix[0]: return []
        #如果matrix为空或matrix的第一行为空,则返回一个空列表。
        M, N = len(matrix), len(matrix[0])
        #获取matrix的行数和列数,分别赋值给M和N
        left, right, up, down = 0, N - 1, 0, M - 1
        #初始化四个变量left、right、up和down,分别表示矩阵的左、右、上、下四个边界
        res = []
        #初始化空列表,用于存储矩阵中的元素
        x, y = 0, 0
        #初始两个变量x,y 用于表示当前起始位置
        dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 定义四个方向
        cur_d = 0  # 初始方向为向右
        while len(res) != M * N:  # 当res中的元素数量等于矩阵中的元素数量时结束循环
            res.append(matrix[x][y])  # 将当前位置的元素添加到res中
            if cur_d == 0 and y == right:  # 如果当前方向为向右且到达了右边界
                cur_d += 1  # 改变方向为向下
                up += 1  # 上边界向下移动一行
            elif cur_d == 1 and x == down:  # 如果当前方向为向下且到达了下边界
                cur_d += 1  # 改变方向为向左
                right -= 1  # 右边界向左移动一列
            elif cur_d == 2 and y == left:  # 如果当前方向为向左且到达了左边界
                cur_d += 1  # 改变方向为向上
                down -= 1  # 下边界向上移动一行
            elif cur_d == 3 and x == up:  # 如果当前方向为向上且到达了上边界
                cur_d += 1  # 改变方向为向右
                left += 1  # 左边界向右移动一列
            cur_d %= 4#将cur_d的值限制在0到3之间,因为dirs列表中只有四个方向。
            x += dirs[cur_d][0]
            y += dirs[cur_d][1]
            #根据当前方向更新当前位置。具体来说,dirs[cur_d][0]和dirs[cur_d][1]分别表示当前方向的行和列的偏移量,将它们加到x和y上即可得到下一个位置的坐标。
        return res#最后,函数返回存储矩阵元素的列表res。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

力扣算法之 螺旋矩阵 附python代码(超超级详细 ) 的相关文章

随机推荐

  • AltiumDesigner19(AD19)使用设置技巧

    之前用AD16 用的很爽 后来老师说 AD19有在线库的功能 可以减少自己画库了 想想挺合适 就安装了AD19 后来发现AD19用着是各种不爽 首先他卡 只怪我电脑配置跟不上 其次 他的预设值跟AD16相比 都没有进行设置 很多都需自己重新
  • 性能测试相关(TPS/RT/PV等)

    对于我们开发来说 我们日常最熟悉的工作就是把客户的需求实现并交付 但是 事情并不是往往就这样结束了 我们还需要后续对上线的系统进行跟踪调查 查看系统的运行情况 为什么呢 一方面 我们需要关注系统在运行过程中的健康问题 是否有异常等等 另一方
  • svn diff

    svn怎么查看某文件的修改记录 svn diff 文件名 svn diff 文件名 会查看本地版本库中所作的修改 cd 到文件所属的目录下使用 svn diff 文件名 svn diff xx cs 或者直接 svn diff 文件路径 文
  • ChatGPT技术原理

    目录 一 Tokenization 二 Transformer模型 三 预训练 四 微调 五 Beam search 总结 自从OpenAI的ChatGPT在2022年底横空出世以来 这款大型语言模型在各种任务中都展现了惊人的性能 包括问答
  • Acunetix无法正常启动

    Acunetix打开提示无法 按Windows R 打开 services msc打开服务界面 查看Acunetix服务是否开启 如果有服务未启动 右键 启动 重新打开Acunetix登录即可
  • 【深入理解C++】类型转换

    文章目录 1 隐式类型转换 2 显式类型转换 强制类型转换 2 1 C语言 2 2 C 语言 2 2 1 static cast 2 2 1 1 可用于 2 2 1 2 不可用于 2 2 2 dynamic cast 2 2 3 const
  • tomcat启动报错java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException?

    我用的是tomcat7 0版本 JDK1 7 在首次使用springMVC做练习的时候报错错误如下 java util concurrent ExecutionException org apache catalina LifecycleE
  • Elasticsearch允许远程链接

    在本地启动Elasticsearch后 发现只能用localhost和127 0 0 1访问 换成电脑的ip地址 显示拒绝访问 需要修改 config elasticsearch yml下的network host 0 0 0 0改成0 0
  • 【网络云盘客户端】——上传文件的功能的实现

    目录 上传文件功能的实现 uploadtask的设计 设置上传的槽函数 uploadFileAction接口 uploadFile接口 定时上传文件 进度条的设计 上传文件功能的实现 上传文件功能实现 1 双击 上传文件 的 QListWi
  • DHCP笔记

    目录 DHCP动态主机配置协议 UDP67 68端口 DHCP获取IP地址 客户端首次获取IP地址 客户端再次获取IP地址 租期 续租 DHCP的工作报文 DHCP的配置 案例 DHCP动态主机配置协议 UDP67 68端口 DHCP是应用
  • 关闭 135 139 445 转

    135端口主要用于使用RPC Remote Procedure Call 远程过程调用 协议并提供DCOM 分布式组件对象模型 服务 端口说明 135端口主要用于使用RPC Remote Procedure Call 远程过程调用 协议并提
  • Unity Shader:Waveform波形(2)-基本波形:正弦,三角,锯齿,直角以及其变种的实现方式

    概述 在Shader中 波形可以作为一种模拟动态的手段 例如颜色的波动 形状的波动 可以基于此创作出各种效果 下文介绍几种基本波形以及变种的Shader实现代码 并配以函数图像和简单动画效果图 在效果图中 Shader代码计算出y值 在顶点
  • es--基础--10--es服务API查询

    es 基础 10 es服务API查询 1 介绍 参考资料 https www knowledgedict com tutorial elasticsearch query html 1 1 查询语句分类 1 1 1 全文查询 match q
  • hive函数02

    hive函数02 窗口函数 窗口函数 Window functions 也叫做开窗函数 OLAP函数 其最大特点是 输入值是从SELECT语句的结果集中的一行或多行的 窗口 中获取的 窗口函数可以简单地解释为类似于聚合函数的计算函数 但是通
  • 面板数据固定效应与霍斯曼检验stata代码

    xtset id year 定义面板数据 xtreg lnpgdp lng lnm fe 带固定效应的面板数据回归 默认固定id即个体的固定效应 xtreg lnpgdp lng lnm i year fe 个体效应和时间效应的固定效应 x
  • Java 集合系列02之 Collection架构(JDK1.6.0_45)

    首先 我们对Collection进行说明 下面先看看Collection的一些框架类的关系图 Collection是一个接口 它主要的两个分支是 List 和 Set List和Set都是接口 它们继承于Collection List是有序
  • SQL使用视图

    视图 SELECT cust name cust contact FROM ProductCustomers 视图 包含一个查询 是虚拟的表 WHERE prod id RGAN01 使用视图的原因 1 重用SQL语句 2 简化复杂的SQL
  • 【Jdbc】java连接mysql数据库的两种不同连接方式

    写在前面的话 在之前刚开始学数据库的时候 一直用Navicat这个数据库可视化管理工具来写sql navicat很棒 但是一般我学习和写项目的时候用的更多应该是idea对吧 然后我就想着学习了一些jdbc的知识 下面是我在之前学习过程中我的
  • 乐高机器人java程序代码_用JAVA编写一个乐高机器人躲避障碍物运动到目标点的程序....

    写出一个可以控制机器人的小程序 使机器人从一边到一个相对面 并至少跨越一个障碍物 规则如下 1 障碍物必须设置在机器人行走的路线上 2 空间的基本配置如插图3 不能用轨道之类的东西 写出一个可以控制机器人的小程序 使机器人从一边到一个相对面
  • 力扣算法之 螺旋矩阵 附python代码(超超级详细 )

    1 题目描述 给你一个 m 行 n 列的矩阵 matrix 请按照 顺时针螺旋顺序 返回矩阵中的所有元素 2 运行示例 输入 matrix 1 2 3 4 5 6 7 8 9 输出 1 2 3 6 9 8 7 4 5 3 解题思路 题意要求