本文共 1756 字,大约阅读时间需要 5 分钟。
生成顺时针螺旋矩阵的Java代码解析及优化
階梯式填充,让矩阵逐层完善循环展开,一圈一圈填满
一何年来,面对编程问题时/someone常常会遇到一个有趣的数学挑战。给定一个整数n,要求生成一个n×n的矩阵,按照顺时针螺旋的方式填充从1到n²的数字。举例而言,当n=3时,生成的矩阵如下:
[[1, 2, 3],[8, 9, 4],[7, 6, 5]]
看大多数人面对这类问题时,往往会想先填充最外层,然后沿着右边继续填充剩下的内部环。这个思路虽然正确,却可能不够高效或者难以扩展。那么,有没有更有效率的方法呢?让我们深入分析一下。
传统的螺旋矩阵生成方法可以视为一种"层叠"的填充方式。在这个算法中,我们会从最外层向内一层层地填充数值。如果把矩阵看作一堆能被分解的"层"的话,每一层可以按照间隔的方式被处理。
具体来说:
这样,每个数字仅会被访问一次,完成整个填充过程的复杂度将仅为O(n²),是等于生成矩阵总体复杂度的。
以下是该方法对应的Java代码:
public class Solution { public int[][] generateMatrix(int n) { int[][] res = new int[n][n]; if (n < 0) return null; int levelCount = n / 2; int count = 1; for (int level = 0; level < levelCount; level++) { for (int i = 0; i < n - 1 - level; i++) { res[level][i] = count++; } for (int i = 0; i < n - 1 - level; i++) { res[i][n - 1 - level] = count++; } for (int i = n - 1 - level; i > level; i--) { res[i][level] = count++; } } if (n % 2 == 1) { res[levelCount][levelCount] = count; } return res; }}
res
,用于存储最终的螺旋矩阵。levelCount
的每一个level,执行三个方向的填充操作:这样的算法运用了逐层填充的思想,确保每个数字只被访问一次,极大地提高了效率。除此之外,该方法的代码结构紧凑,易于理解,符合大多数开发者的写法习惯。
需要注意的是,这个算法虽然在大多数情况下有效,但是当n=1时,需要特意处理。那么,问题是如何应对这种特殊情况呢?很简单,只需要在最终步骤中加入一个简单的条件判断即可。例如,在确定层数之后,如果n为1,则直接将唯一的数字填入res数组。
这样的处理方式不仅保证了算法的正确性,还大大扩展了其适用范围,使其不再受限于n的大小。
综合来看,这种螺旋矩阵生成的方法既高效又简洁,适合大多数实际场景,此外,它的代码结构也非常友好,容易根据具体需求进行扩展。
转载地址:http://emgyk.baihongyu.com/