博客
关于我
Leetcode: Spiral Matrix II
阅读量:790 次
发布时间:2023-01-31

本文共 1756 字,大约阅读时间需要 5 分钟。

生成顺时针螺旋矩阵的Java代码解析及优化

階梯式填充,让矩阵逐层完善循环展开,一圈一圈填满

一何年来,面对编程问题时/someone常常会遇到一个有趣的数学挑战。给定一个整数n,要求生成一个n×n的矩阵,按照顺时针螺旋的方式填充从1到n²的数字。举例而言,当n=3时,生成的矩阵如下:

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

看大多数人面对这类问题时,往往会想先填充最外层,然后沿着右边继续填充剩下的内部环。这个思路虽然正确,却可能不够高效或者难以扩展。那么,有没有更有效率的方法呢?让我们深入分析一下。

方法思路:雕刻螺旋层

传统的螺旋矩阵生成方法可以视为一种"层叠"的填充方式。在这个算法中,我们会从最外层向内一层层地填充数值。如果把矩阵看作一堆能被分解的"层"的话,每一层可以按照间隔的方式被处理。

具体来说:

  • 创建一个n×n的二维数组,用来存放最终的数字。
  • 计算需要填充的层数,层数为n/2。
  • 对于每一层,按顺序从左到右填充,然后从顶部到底部填充。
  • 当n为奇数时,中心的数字需要特别处理。
  • 这样,每个数字仅会被访问一次,完成整个填充过程的复杂度将仅为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;    }}

    代码解释

  • 初始化数组:创建一个大小为n×n的二维数组res,用于存储最终的螺旋矩阵。
  • 处理负数情况:如果输入的n为负数,直接返回null。
  • 计算层数:层数等于n除以2(取整)。
  • 循环填充每一层:对于层数小于levelCount的每一个level,执行三个方向的填充操作:
    • 第一方向:从左到右填充当前层的左边部分。
    • 第二方向:从上到下填充当前层的上部。
    • 第三方向:从右到左填充当前层的底部。
    1. 处理奇数情况:当n为奇数时,中心的数字需要单独设置。
    2. 这样的算法运用了逐层填充的思想,确保每个数字只被访问一次,极大地提高了效率。除此之外,该方法的代码结构紧凑,易于理解,符合大多数开发者的写法习惯。

      终极技隔离:保持灵活性

      需要注意的是,这个算法虽然在大多数情况下有效,但是当n=1时,需要特意处理。那么,问题是如何应对这种特殊情况呢?很简单,只需要在最终步骤中加入一个简单的条件判断即可。例如,在确定层数之后,如果n为1,则直接将唯一的数字填入res数组。

      这样的处理方式不仅保证了算法的正确性,还大大扩展了其适用范围,使其不再受限于n的大小。

      综合来看,这种螺旋矩阵生成的方法既高效又简洁,适合大多数实际场景,此外,它的代码结构也非常友好,容易根据具体需求进行扩展。

    转载地址:http://emgyk.baihongyu.com/

    你可能感兴趣的文章
    Laravel 使用 - artisan schedule使用
    查看>>
    Laravel 使用rdkafka
    查看>>
    Laravel 多环境配置
    查看>>
    laravel 学习之第二章
    查看>>
    Laravel 安装上传代码不完整的解决方法
    查看>>
    laravel 安装添加多站点
    查看>>
    Laravel 模型
    查看>>
    Laravel 深入理解路由和URL生成
    查看>>
    laravel 生命周期与框架精髓
    查看>>
    laravel 表单验证
    查看>>
    laravel 调试sql
    查看>>
    laravel 路由缓存
    查看>>
    laravel 通过令牌获取用户ID
    查看>>
    laravel 部署 file_put_contents failed to open stream: No such file or directory
    查看>>
    Laravel5.5 集成 mPDF
    查看>>
    laravel5.5中添加对分页样式的修改上一页和下一页
    查看>>
    Laravel5.5开发规范 [ 个人总结 ]
    查看>>
    laravel5.5数据库迁移入门实践
    查看>>
    Laravel5.5添加新路由文件并制定规则
    查看>>
    laravel5.5组件之 Forms & HTML 组件 (laravelcollective/html)
    查看>>