面试知识库

54. 螺旋矩阵#

生活中的螺旋#

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

问题描述#

题目目标#

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

示例 1#

输入:

matrix = [[1,2,3],
                [4,5,6],
                [7,8,9]]
text

输出:

[1,2,3,6,9,8,7,4,5]

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

矩阵示意:

1 2 3
4 5 6
7 8 9
text

说明: 图示把输入结构和输出结果并排展开后,会更容易直接看清题目的变化过程。

补充说明#

  • 矩阵按行给出,外层数组表示所有行,内层数组表示每一行的元素。

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

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

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

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

优化解法:边界收缩#

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

边界收缩的原理#

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

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

示例运行#

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

Java代码实现#

实用技巧总结#

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

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

类似的问题还有:

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

小结#

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