Spirally Traversing a Matrix in Java

2025年5月6日 | 阅读 5 分钟

螺旋遍历矩阵是指以圆周模式移动通过元素,从左上角开始,沿顶行向右移动。在每次行或列遍历之后,边界都会被调整,并且方向会被切换,持续进行直到所有元素都被探索。此技术提供了以螺旋顺序检索矩阵元素的有效方法。

示例 1

输入

输出

 
1 2 3 6 9 8 7 4 5   

说明:矩阵从左上角开始按螺旋顺序遍历。

示例 2

输入

输出

 
1 2 3 4 8 12 11 10 9 5 6 7   

说明:遍历首先沿着外部边界移动,然后到达内部行。

示例 3

输入

输出

 
1 2 4 3   

说明:这是一个 2x2 矩阵;螺旋遍历在一个循环中完成。

朴素方法

上述代码中的朴素方法涉及逐层遍历矩阵,从最外层边界开始向内移动。它通过在每次行或列遍历后调整边界,系统地以螺旋顺序打印元素。

算法

步骤 1:设置 top、bottom、left 和 right 来表示矩阵的边缘。

步骤 2:沿着顶边界从左到右遍历并更新 top。

步骤 3:沿着右边界从上到下遍历并更新 right。

步骤 4:沿着底边界从右到左遍历并更新 bottom。

步骤 5:沿着左边界从下到上遍历并更新 left。

实施

文件名:SpiralMatrix.java

输出

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

时间复杂度:O(N*M)

辅助空间:O(N*M)

空间优化方法

上述代码中的空间优化方法使用常数空间 O(1),因为它只修改矩阵的边界,而无需任何额外的数据结构。它直接以螺旋顺序打印元素,而无需将它们存储在辅助数组或列表中。

算法

步骤 1:设置 top、bottom、left 和 right。

步骤 2:从左到右打印元素;向上移动 top。

步骤 3:从上到下打印元素;向左移动 right。

步骤 4:如果有效,则从右到左打印元素;向下移动 bottom。

步骤 5:如果有效,则从下到上打印元素;向右移动 left。重复直到边界交叉。

实施

文件名:SpiralMatrixBoundaries.java

输出

 
Spiral order:
1 2 3 6 9 8 7 4 5   

时间复杂度:O(N*M),其中 N 是矩阵的行数,M 是矩阵的列数。程序访问每个元素恰好一次。

辅助空间:O(1),因为遍历是在原地进行的,不使用任何额外的数据结构


下一个主题最长公共子序列