【忍者算法】从生活场景到螺旋矩阵:探索矩阵的螺旋遍历|LeetCode 54 螺旋矩阵

从生活场景到螺旋矩阵:探索矩阵的螺旋遍历

生活中的螺旋

你有没有注意过,生活中螺旋的形状随处可见?比如蜗牛壳的螺旋纹路、向日葵中心的螺旋排列、甚至是停车场的螺旋坡道。这种由外向内(或由内向外)的螺旋路径,不仅是大自然的奇妙设计,也启发了我们解决一些编程问题。

问题描述

LeetCode第54题"螺旋矩阵"是这样描述的:给你一个 m x n 的矩阵,请按照顺时针螺旋顺序,返回矩阵中的所有元素。

例如:

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

想象你在逛一个方形的购物中心,从正门开始,按顺时针方向走完每条走廊,最终到达中心的休息区。这就是一个完美的螺旋路径!

最直观的解法:模拟螺旋过程

就像我们在购物中心逛街一样,最直观的方法是:按照右、下、左、上的顺序,一步步"走"过矩阵的每个元素。

让我们用一个简单的3×3矩阵来理解:

1 2 3     →→→     第一步:向右走到底
4 5 6     ↓       第二步:向下走到底
7 8 9     ←←←     第三步:向左走到底↑       第四步:向上走到顶

优化解法:边界收缩

仔细观察,我们其实是在不断缩小遍历的范围。就像削苹果皮,从外面一圈圈向内削去。我们可以维护四个边界(上、下、左、右),每走完一个方向就收缩对应的边界。

边界收缩的原理

想象你在玩一个迷宫游戏:

  1. 一开始,你可以在整个迷宫中移动
  2. 走完一条路径后,那条路就会消失(边界收缩)
  3. 在剩余的空间中继续移动
  4. 直到走完所有路径

示例运行

用一个3×3的例子来说明:

初始状态:
上边界(top)=0, 下边界(bottom)=2
左边界(left)=0, 右边界(right)=2第一圈:
1. 向右:(0,0)->(0,2) [1,2,3]上边界+1
2. 向下:(0,2)->(2,2) [6,9]右边界-1
3. 向左:(2,2)->(2,0) [8,7]下边界-1
4. 向上:(2,0)->(1,0) [4]左边界+1第二圈:
只剩中间的5,直接添加

Java代码实现

public List<Integer> spiralOrder(int[][] matrix) {List<Integer> result = new ArrayList<>();if (matrix == null || matrix.length == 0) {return result;}// 定义四个边界int top = 0;int bottom = matrix.length - 1;int left = 0;int right = matrix[0].length - 1;while (top <= bottom && left <= right) {// 向右移动,遍历上边界for (int i = left; i <= right; i++) {result.add(matrix[top][i]);}top++;  // 收缩上边界// 向下移动,遍历右边界for (int i = top; i <= bottom; i++) {result.add(matrix[i][right]);}right--;  // 收缩右边界if (top <= bottom) {  // 确保还有行要遍历// 向左移动,遍历下边界for (int i = right; i >= left; i--) {result.add(matrix[bottom][i]);}bottom--;  // 收缩下边界}if (left <= right) {  // 确保还有列要遍历// 向上移动,遍历左边界for (int i = bottom; i >= top; i--) {result.add(matrix[i][left]);}left++;  // 收缩左边界}}return result;
}

实用技巧总结

解决螺旋矩阵问题的关键点:

  1. 明确移动方向的顺序(右->下->左->上)
  2. 正确维护和更新边界
  3. 注意边界条件的判断
  4. 处理特殊情况(如只有一行或一列)

类似的问题还有:

  • 生成螺旋矩阵
  • 对角线遍历
  • 顺时针打印矩阵

小结

通过螺旋矩阵这道题,我们学会了如何用编程来模拟现实生活中的螺旋路径。这种思维方式不仅能解决算法题,在处理图像处理、游戏开发等实际问题时也很有用。记住,当遇到需要特定顺序遍历矩阵的问题时,可以考虑使用边界收缩的方法,让代码更加清晰和高效!


作者:忍者算法
公众号:忍者算法

我准备了一份刷题清单,以及这些题目的详细题解,覆盖了绝大部分常见面试题。我可以很负责任地说,只要你把这些题真正掌握了,80%的算法面试都能遇到相似题目。公众号回复【刷题清单】获取~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宏定义

宏定义 # 和 ## #号(将符号转为字符串) 这条定义中,定义了一个 PRINT 的宏函数预处理器遇到这样的宏,会将 #a 替换成以字符串表示的参数 a 例如:##号(连接符:将2个表达式连接到一起)预处理器会将这2条宏扩展成下面的代码我们可以看到:这2条宏定义其实就是定义了2个成员…

《Operating System Concepts》阅读笔记:p2-p8

《Operating System Concepts》学习第 2 天,p2-p8 总结,总计 7 页。 一、技术总结 1.operating system An operating system is software that manages a computer’s hardware。 2.system bus data bus, address bus, control bus 统称为 system bus。 二、英语总结(生词:…

踩坑---中断中调用系统定时器延时卡死

踩坑---中断中调用系统定时器延时卡死 背景 ​ 配置外部中断作为按键输入时,调用了系统滴答定时器为基准的延时。然后每次一按按键,单片机就卡死。一开始怀疑时中断没有配置好。反复研究中断配置是否出现错误,最后debug出来,发现卡在了// 3. 等待计数值变为0,判断CTRL标志…

windows 10 安装 wsl

在 windows 上安装 Debian 版本的 wsl以管理员身份运行 cmd,执行 wsl --help 可查看 wsl 的帮助信息。执行 wsl --list --online 查看可供安装的 wsl子系统 版本。执行 wsl --install --distribution Debian 安装 debian 版本的 wsl有了计划记得推动,不要原地踏步。

开学作业13

学习使用了vue中watch知识 可以实时更新数据 也非常好用

开学作业14

前几天也是这样通过打电话合作 前后端分着写 已经完成大部分前后端的交并 预计明天写完

做开学作业10

使用的是element ui vue2 springboot技术

手把手教你如何用飞书实现betterGI消息推送

在平时,我们一般会使用betterGI的一条龙系统来完成体力的刷取,有的人可能需要知道啥时候刷完体力方便远程关闭电脑啥的,这里给大家如何通过飞书实现BetterGI消息推送的方法 1、支持的事件提醒 事件列表 notify.test : 测试通知 domain.reward : 自动秘境奖励 domain.start :…

2025【重庆联通】活动

2025年2月8日更新 扫码显示详情及办理 扫码显示详情及办理 套餐资费和活动内容均来源于重庆联通【10010人工客服可查,中国联通app官方客服可查】 这里是下面的54个活动的办理名称,请确认【点击也可直接跳转到相应位置】1.云创安全组合包10元(CQ)-立即生效 2.云创数字人名片权…

LLVM+CMAKE+VScode

在mac上使用vscode+CMAKE+LLVM 配置C++环境 仅供参考,请多谅解 原先的vscode官方推荐插件intellisense实在是太慢,以至于在很多大型项目(ns3,OS)等进行静态检查的速度奇慢无比,并且大量消耗资源。于是尝试在mac上使用llvm+clangd进行配置。由于采用的是homebrew安装clang…

FastAPI for Machine Learning: Live coding an ML web application

FastAPI for Machine Learning: Live coding an ML web application https://www.bilibili.com/video/BV1kC411b7Se/?spm_id_from=333.788.videopod.sections&vd_source=57e261300f39bf692de396b55bf8c41b翻译:FastAPI用于机器学习:现场编码一个ML Web应用程序。欢迎!加…

08_LaTeX之自定义LaTeX命令和功能

本章的内容将让你能编写可重复利用的模块——宏包和文档类,并在其中自己定义命令和环境。08_\(\LaTeX{}\) 之自定义\(\LaTeX{}\)命令和功能 目录08_\(\LaTeX{}\) 之自定义\(\LaTeX{}\)命令和功能自定义命令和环境定义新命令定义环境xparse 宏包简介编写自己的宏包和文档类编写…