LeetCode【0054】螺旋矩阵

news2024/12/28 20:24:48

本文目录

  • 1 中文题目
  • 2 求解方法:数学模拟
    • 2.1 方法思路
    • 2.2 Python代码
    • 2.3 复杂度分析
  • 3 题目总结

1 中文题目

给定一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例:

在这里插入图片描述
在这里插入图片描述

提示:

  • 1 ≤ m a t r i x . l e n g t h , m a t r i x [ i ] . l e n g t h ≤ 10 1 \leq matrix.length, matrix[i].length \leq 10 1matrix.length,matrix[i].length10
  • − 100 ≤ m a t r i x [ i ] [ j ] ≤ 100 -100 \leq matrix[i][j] \leq 100 100matrix[i][j]100

2 求解方法:数学模拟

2.1 方法思路

方法核心

使用四个指针分别表示矩阵的上下左右边界,按照顺时针方向遍历矩阵边界元素,每遍历完一圈后向内收缩边界继续遍历,直到所有元素都被遍历完成,整个过程只需要一次遍历就能完成矩阵的螺旋序列输出。

实现步骤

(1)初始化阶段:

  • 定义四个边界变量:left、right、top、bottom
  • 创建结果列表用于存储遍历顺序
  • 检查矩阵是否为空

(2)遍历过程:

  • 按照顺时针方向依次遍历四条边
  • 每完成一圈遍历后收缩边界
  • 直到边界交叉或重合为止

(3)边界处理:

  • 遍历上边界时从左到右
  • 遍历右边界时从上到下
  • 遍历下边界时从右到左
  • 遍历左边界时从下到上

(4)收缩规则:

  • 完成一圈遍历后
  • 左边界向右移动
  • 右边界向左移动
  • 上边界向下移动
  • 下边界向上移动

方法示例

matrix = [[1,2,3],[4,5,6],[7,8,9]] 为例:

初始状态:
left = 0, right = 2
top = 0, bottom = 2
result = []

第一圈遍历:
1. 上边界:[1,2,3]
   result = [1,2,3]

2. 右边界:[6,9]
   result = [1,2,3,6,9]

3. 下边界:[8,7]
   result = [1,2,3,6,9,8,7]

4. 左边界:[4]
   result = [1,2,3,6,9,8,7,4]

边界收缩:
left = 1, right = 1
top = 1, bottom = 1

第二圈遍历:
1. 只剩中心点 5
   result = [1,2,3,6,9,8,7,4,5]

遍历完成,返回结果

2.2 Python代码

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        # 如果矩阵为空,直接返回空列表
        if not matrix:
            return []
        
        # 定义结果列表
        result = []
        
        # 定义四个边界
        left, right = 0, len(matrix[0]) - 1  # 左右边界
        top, bottom = 0, len(matrix) - 1      # 上下边界
        
        # 当边界合法时继续遍历
        while left <= right and top <= bottom:
            # 1. 从左到右遍历上边界
            for col in range(left, right + 1):
                result.append(matrix[top][col])
            
            # 2. 从上到下遍历右边界
            for row in range(top + 1, bottom + 1):
                result.append(matrix[row][right])
                
            # 如果上下边界或左右边界重合,说明已经遍历完成
            if left < right and top < bottom:
                # 3. 从右到左遍历下边界
                for col in range(right - 1, left - 1, -1):
                    result.append(matrix[bottom][col])
                
                # 4. 从下到上遍历左边界
                for row in range(bottom - 1, top, -1):
                    result.append(matrix[row][left])
            
            # 缩小边界
            left += 1
            right -= 1
            top += 1
            bottom -= 1
        
        return result

2.3 复杂度分析

  • 时间复杂度:O(m*n),m 和 n 分别是矩阵的行数和列数
    • 每个元素只被访问一次
    • 没有重复访问的元素
  • 空间复杂度:O(1)
    • 只使用了固定数量的变量

3 题目总结

题目难度:中等
数据结构:矩阵
应用算法:四指针、数学模拟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

万字长文解读深度学习——训练(DeepSpeed、Accelerate)、优化(蒸馏、剪枝、量化)、部署细节

&#x1f33a;历史文章列表&#x1f33a; 深度学习——优化算法、激活函数、归一化、正则化深度学习——权重初始化、评估指标、梯度消失和梯度爆炸深度学习——前向传播与反向传播、神经网络&#xff08;前馈神经网络与反馈神经网络&#xff09;、常见算法概要汇总万字长文解读…

C#版使用融合通信API发送手机短信息

目录 功能实现 范例运行环境 实现范例 类设计 类代码实现 调用范例 总结 功能实现 融合云通信服务平台&#xff0c;为企业提供全方位通信服务&#xff0c;发送手机短信是其一项核心功能&#xff0c;本文将讲述如何使用融合云服务API为终端手机用户发送短信信息&#xf…

第四十五章 Vue之Vuex模块化创建(module)

目录 一、引言 二、模块化拆分创建方式 三、模块化拆分完整代码 3.1. index.js 3.2. module1.js 3.3. module2.js 3.4. module3.js 3.5. main.js 3.6. App.vue 3.7. Son1.vue 3.8. Son2.vue 四、访问模块module的state ​五、访问模块中的getters ​六、mutati…

如何解决不能将开发板连接到虚拟机的问题(连接显示灰色,不能选中)

-- 如果连接上rk3588单片机&#xff0c;虚拟机无法来连接&#xff0c;如何更改 -- 先将虚拟机关机 -- 将虚拟机的配置文件以文本文件的形式打开 -- 再将所有的FALSE改为TRUE即可 -- 然后再次打开虚拟机即可

什么是白盒测试

一、什么是白盒测试 白盒测试又称结构测试、逻辑驱动测试或基于代码的测试。 白盒测试是一种测试用例设计方法&#xff0c;盒子指的是被测试的软件&#xff0c;白盒指的是盒子是可视的&#xff0c;即清楚盒子内部的东西以及里面是如何运作的。 "白盒"法需要测试者…

图形 2.6 伽马校正

伽马校正 B站视频&#xff1a;图形 2.6 伽马校正 文章目录 伽马校正颜色空间传递函数 Gamma校正校正过程为什么需要校正&#xff1f;CRT与转换函数 为什么sRGB在Gamma 0.45空间&#xff1f; 人对亮度的敏感韦伯定律中灰值 线性工作流不在线性空间下进行渲染的问题统一到线性空…

Android setContentView执行流程(一)-生成DecorView

Android setContentView执行流程(一)-生成DecorView Android setContentView执行流程(二)-将布局添加到mContentParent setContentView的流程主要就是讲在Activity的onCreate方法中调用setContentView方法之后&#xff0c;我们自定义的xml文件加载的过程&#xff0c;学习它可以…

【计算机网络】【网络层】【习题】

计算机网络-网络层-习题 文章目录 13. 图 4-69 给出了距离-向量协议工作过程&#xff0c;表&#xff08;a&#xff09;是路由表 R1 初始的路由表&#xff0c;表&#xff08;b&#xff09;是相邻路由器 R2 传送来的路由表。请写出 R1 更新后的路由表&#xff08;c&#xff09;。…

图像处理实验四(Adaptive Filter)

一、Adaptive Filter简介 自适应滤波器&#xff08;Adaptive Filter&#xff09;是一种能够根据输入信号的统计特性自动调整自身参数以达到最佳滤波效果的滤波器。它广泛应用于信号处理领域&#xff0c;如信道均衡、系统识别、声学回波抵消、生物医学、雷达、波束形成等模块。 …

typedef 与 extern 的结合:一场误解的澄清

typedef 与 extern 的结合:一场误解的澄清 一、typedef 的基本用法二、extern 的基本用法三、typedef 与 extern 的结合:一场误解的澄清示例二:使用 extern 声明外部变量示例三:错误的用法:尝试在 typedef 中使用 extern四、总结在C语言编程的世界里,typedef和extern是两…

Qt_day5_常用类

常用类 目录 1. QString 字符串类&#xff08;掌握&#xff09; 2. 容器类&#xff08;掌握&#xff09; 2.1 顺序容器QList 2.2 关联容器QMap 3. 几种Qt数据类型&#xff08;熟悉&#xff09; 3.1 跨平台数据类型 3.2 QVariant 统一数据类型 3.3 QStringList 字符串列表 4. QD…

HashMap的put流程知道吗

HashMap 的 put 方法算是 HashMap 中比较核心的功能了&#xff0c;复杂程度高但是算法巧妙&#xff0c;同时在上一版本的基础之上优化了存储结构&#xff0c;从链表逐步进化成了红黑树&#xff0c;以满足存取性能上的需要。本文逐行分析了 put 方法的执行流程&#xff0c;重点放…

鸿蒙UI开发——实现环形文字

1、背 景 有朋友提问&#xff1a;您好关于鸿蒙UI想咨询一个问题 如果我想实现展示环形文字是需要通过在Text组件中设置transition来实现么&#xff0c;还是需要通过其他方式来实现。 针对这位粉丝朋友的提问&#xff0c;我们做一下解答。 2、实现环形文字效果 ❓ 什么是环形…

保存pytest的执行日志;在日志中显示当前是第几次执行

1、在本地保存执行日志&#xff1a; 在终端中执行时因为指定了-s参数&#xff0c;所以会打印相关信息&#xff0c;可以帮助我们后续定位问题&#xff1a; 但是显示在终端时后面无法查看&#xff0c;所以需要把执行日志保存在本地&#xff0c;使用tee 或 重定向符号>&#x…

2024年8个最佳在线websocket调试工具选择

精选了 8 款功能强大且易于使用的 WebSocket 测试工具&#xff1a; 工具名称支持的系统是否免费ApifoxWindows, Mac, Linux是WebSocket KingWindows, Mac, Linux是PostmanWindows, Mac, Linux是Socket.IO Test ClientWindows, Mac, Linux是InsomniaWindows, Mac, Linux是Wires…

H5流媒体播放器EasyPlayer.js播放器wasm编译打包之后报uncaught referenceErro的原因排查

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

初识算法 · 位运算(2)

目录 前言&#xff1a; 判定字符是否唯一 丢失的数字 比特位计数 只出现一次的数字III 前言&#xff1a; ​本文的主题是位运算&#xff0c;通过四道题目讲解&#xff0c;一道是判断字符是否唯一&#xff0c;一道是只出现一次的数字III&#xff0c;一道是比特位计数&…

丹摩征文活动 | 丹摩智算平台:服务器虚拟化的璀璨明珠与实战秘籍

丹摩DAMODEL&#xff5c;让AI开发更简单&#xff01;算力租赁上丹摩&#xff01; 目录 一、引言 二、丹摩智算平台概述 &#xff08;一&#xff09;平台架构 &#xff08;二&#xff09;平台特点 三、服务器虚拟化基础 &#xff08;一&#xff09;虚拟化的概念 &#xf…

[Docker#6] 镜像 | 常用命令 | 迁移镜像 | 压缩与共享

目录 Docker 镜像是什么 生活案例 为什么需要镜像 镜像命令详解 实验 1.一些操作 1. 遍历查看镜像 2. 查看镜像仓库在本地的存储信息 进入镜像存储目录 查看 repositories.json 文件 3. 镜像过滤 4. 下载镜像时的分层 实战一&#xff1a;离线迁移镜像 实战二&…

信用租赁系统的灵活配置与智能化管理助力租赁市场发展

内容概要 在现代租赁市场中&#xff0c;信用租赁系统就像一把金钥匙&#xff0c;打开了灵活配置与智能化管理的大门。首先&#xff0c;让我们看看它是如何运作的。这个系统允许用户根据自身需求自定义设备类型和信用分比例&#xff0c;不同租赁形式的选择使得整个过程更加个性…