当前位置: 首页 > article >正文

leetcode54:螺旋矩阵

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

示例 1:

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

示例 2:

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

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

步骤1:题目分析

目标:在给定的 mn 列矩阵 matrix 中,从左上角开始,按顺时针顺序遍历矩阵,返回所有元素的顺序列表。

输入输出条件

  • 输入矩阵 matrix 的大小为 m x n,即有 m 行和 n 列。
  • 输出为按顺时针顺序排列的矩阵元素列表。

限制条件

  • 1 <= m, n <= 10,即矩阵最大为 10x10 的大小。
  • 每个矩阵元素的值在 -100 <= matrix[i][j] <= 100 的范围内。

边界条件

  1. 单行或单列矩阵(例如 1xNMx1)的特殊情况。
  2. 矩阵大小为 1x1 的情况。
  3. 空矩阵(在此题中不会出现,因为 mn 均不小于 1)。

步骤2:解题思路与步骤分解

算法设计: 我们可以通过模拟顺时针遍历的方式来解决这个问题,即通过设定矩阵的四个边界(上、下、左、右)逐层向内收缩。这种方法是双指针法的变体。

解决方案步骤:
  1. 初始化边界
    • 定义四个变量表示矩阵的边界:
      • top 为上边界,初始值为 0。
      • bottom 为下边界,初始值为 m - 1
      • left 为左边界,初始值为 0。
      • right 为右边界,初始值为 n - 1
  2. 按顺时针方向遍历矩阵
    • 使用循环依次遍历矩阵的边界,依次向内缩小边界:
      • 从左到右遍历上边界,将元素添加到结果列表中,top 向下移动(top++)。
      • 从上到下遍历右边界,将元素添加到结果列表中,right 向左移动(right--)。
      • 从右到左遍历下边界(如果下边界仍然在 top 下方),bottom 向上移动(bottom--)。
      • 从下到上遍历左边界(如果左边界仍然在 right 左方),left 向右移动(left++)。
  3. 循环终止条件
    • top 超过 bottomleft 超过 right 时,所有元素都已访问完毕,退出循环。

时间复杂度和空间复杂度

  • 时间复杂度:O(m * n),因为每个元素都会被访问一次。
  • 空间复杂度:O(1),如果不计输出所占的空间。

步骤3:C++ 实现代码

代码解释

  • 本代码使用一个 result 向量存储遍历的结果。
  • 按顺时针方向依次处理上、右、下、左边界,每遍历完一条边界就将对应边界缩小,确保按螺旋顺序。
  • 使用条件判断确保边界仍然存在,避免重复访问。

步骤4:解题启发

此题体现了双指针法边界控制在解决二维矩阵问题中的应用。通过限制边界逐步向内收缩,可以高效地完成矩阵遍历。此外,按螺旋顺序访问矩阵也可以应用到其他变形场景(如逆时针、反向等),增加了二维数据的遍历灵活性。这种方法能够减少不必要的重复访问,在数据量较大时可以保持较高的效率。

步骤5:实际应用场景

螺旋顺序遍历的算法可以在许多实际场景中使用,特别是在图像处理硬件操作中,例如:

  • 打印电路板(PCB)检测:在制造 PCB 时,需要对电路板上的焊点进行检查。使用螺旋遍历可以将检测头从中心开始逐层检测,以确保所有区域都能被遍历到。这种螺旋顺序可以减少检测器的移动次数,从而提升检测效率。

实现方式:

  1. 将 PCB 表面映射为二维矩阵,将检测点定义为矩阵的元素。
  2. 使用螺旋遍历算法控制检测头的移动路径,从中心开始螺旋式向外扩展。
  3. 每个点被访问时,检测设备执行一次焊点检测操作,记录检测结果。

此方法可以减少检测头的移动距离和时间,提高生产效率,并降低检测的整体能耗。


http://www.kler.cn/a/350374.html

相关文章:

  • 用于牙科的多任务视频增强
  • PostgreSQL的学习心得和知识总结(一百六十六)|深入理解PostgreSQL数据库之\watch元命令的实现原理
  • 玉米植物结构受乙烯生物合成基因 ZmACS7 的调控
  • 上位机工作感想-2024年工作总结和来年计划
  • C++语言的文件操作
  • 【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件
  • 婴儿游泳馆会员管理软件试用版下载 佳易王儿童游泳会员次卡管理系统操作教程
  • GaussDB主备版 8 工具学习
  • SQL Server 基础查询语句
  • 【Linux】C文件头文件数裁剪前58644个,裁剪后9373个
  • jarvis OJ web浅析
  • 微信小程序路由跳转的区别及其常见的使用场景
  • springboot-网站开发-linux服务器部署jar格式图片存档路径问题
  • 堆排序(C++实现)
  • MySQL 之LRU 缓存管理算法
  • ESP32-S3芯片AI开发应用,图像识别与语音唤醒方案,启明云端乐鑫代理商
  • 24/10/12 算法笔记 NiN
  • Linux10-9
  • Git 深度解析 —— 从基础到进阶
  • [哈工大]战德臣 数据库系统 第3讲 关系模型之基本概念
  • 【时时三省】(C语言基础)函数介绍strcat
  • p20 docker自己commit一个镜像 p21 容器数据卷 p22mysql同步数据(国内镜像被封锁暂时往后放)p23具名挂载和匿名挂载
  • 代码随想录算法训练营第五十五天| 图论入门
  • C#源码安装ZedGraph曲线显示组件
  • flutter 使用三方/自家字体
  • 深度学习:LSTM循环神经网络实现评论情感分析