Java 中的螺旋矩阵问题

2025 年 1 月 6 日 | 阅读 4 分钟

生成螺旋矩阵是计算机科学和编码面试中的一个常见问题。挑战在于从左上角开始,向中心移动,以螺旋顺序填充矩阵。在这里,我们将讨论两种在 Java 中解决此问题的方

  1. 使用迭代方法
  2. 使用递归方法

使用迭代方法

它涉及通过定义边界(上、下、左、右)并随着以螺旋顺序填充值而调整它们来迭代地填充矩阵。

初始化边界:定义矩阵的顶部、底部、左侧和右侧的初始边界。

填充值:使用循环填充值,同时在以螺旋方式填充每一侧(顶部、右侧、底部、左侧)后调整边界。

调整边界:填充每一侧后,调整相应的边界以向内移动。

文件名:SpiralMatrix.java

输出

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

时间复杂度:O(n2),因为矩阵中的每个元素都只访问一次。

空间复杂度:O(1),用于矩阵填充过程(不包括矩阵本身所需的空间)。

使用递归方法

它涉及通过定义边界(上、下、左、右)并随着以螺旋顺序填充值而调整它们来递归地填充矩阵。

初始化边界:定义矩阵的顶部、底部、左侧和右侧的初始边界。

递归填充:使用递归函数填充值,同时在以螺旋方式填充每一侧(顶部、右侧、底部、左侧)后调整边界。

基本情况:当边界重叠或值超过 n×n 时停止递归。

文件名:SpiralMatrixRecursive.java

输出

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

时间复杂度:O(n2 ),因为矩阵中的每个元素都只访问一次。

空间复杂度:O(n),由于递归堆栈。

结论

通过迭代和递归方法都可以实现螺旋矩阵的生成,每种方法都有其优点。

  • 迭代方法:这种方法很简单,易于理解。它涉及在以螺旋顺序填充矩阵的同时定义和调整边界。其时间复杂度为 O(n2 ),矩阵填充过程的空间复杂度为 O(1)。
  • 递归方法:这种方法更优雅,并依赖于递归来逐层填充矩阵。虽然其时间复杂度也为 O(n2 ),但它为递归堆栈使用了额外的空间,导致空间复杂度为 O(n)。

这两种方法都可以有效地生成螺旋矩阵,选择哪种方法取决于您问题的具体要求和限制,例如可读性、易于实现性和可用内存。了解这些方法可以使您掌握处理矩阵生成任务的通用技术。