LeetCode题练习与总结:螺旋矩阵Ⅱ--59

一、题目描述

给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 20

二、解题思路

  1. 初始化一个 n x n 的矩阵,所有元素设为 0。
  2. 定义一个变量 value 用来填充矩阵,起始值为 1。
  3. 使用四个变量 startRow, endRow, startCol, endCol 来标记当前填充区域的边界。
  4. 在一个循环中,按照螺旋顺序填充矩阵,每次填充完一层后,边界向内收缩,直到所有元素都被填充。
  5. 填充顺序为:从左到右,从上到下,从右到左,从下到上,每次填充后更新边界。

三、具体代码

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        int value = 1;
        int startRow = 0, endRow = n - 1;
        int startCol = 0, endCol = n - 1;

        while (value <= n * n) {
            for (int i = startCol; i <= endCol; i++) {
                matrix[startRow][i] = value++;
            }
            startRow++;

            for (int i = startRow; i <= endRow; i++) {
                matrix[i][endCol] = value++;
            }
            endCol--;

            if (startRow <= endRow) {
                for (int i = endCol; i >= startCol; i--) {
                    matrix[endRow][i] = value++;
                }
                endRow--;
            }

            if (startCol <= endCol) {
                for (int i = endRow; i >= startRow; i--) {
                    matrix[i][startCol] = value++;
                }
                startCol++;
            }
        }

        return matrix;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 该算法的主要操作是按螺旋顺序填充矩阵。每次循环迭代都会填充一层,直到所有 n * n 个元素都被填充完毕。
  • 每层包含的元素数量从 n 开始递减,直到 1。具体来说,第一层有 n 个元素,第二层有 n - 2 个元素,依此类推,直到最后一层只有 1 个元素。
  • 因此,总的元素数量是 n * (n + 1) / 2,这是一个等差数列的求和公式。
  • 所以,时间复杂度为 O(n^2),因为我们需要填充整个 n x n 矩阵。
2. 空间复杂度
  • 空间复杂度主要由创建的 n x n 矩阵决定,因为这是算法中唯一的额外空间消耗。
  • 矩阵占用的空间是 n * n * int.size,其中 int.size 是整型变量在内存中的大小(通常为 4 或 8 字节)。
  • 因此,空间复杂度为 O(n^2)。

五、总结知识点

1. 二维数组的初始化和使用:代码中创建了一个 n x n 的二维数组 matrix 用于存储生成的螺旋矩阵。

2. 循环控制:使用 while 循环来控制矩阵填充的过程,循环条件是 value(当前填充的数值)是否超过了矩阵元素的总数 n * n

3. 变量的使用

  • value 用于记录当前应该填充的数值。
  • startRowendRow 表示当前填充区域的行的起始和结束索引。
  • startColendCol 表示当前填充区域的列的起始和结束索引。

4. 螺旋填充逻辑:代码通过四个方向的循环来填充矩阵,每个方向填充后,都会更新 value 和边界索引 startRow, endRow, startCol, endCol。这四个方向分别是:

  • 从左到右填充顶层。
  • 从上到下填充右侧。
  • 从右到左填充底层。
  • 从下到上填充左侧。

5. 边界更新:在每次填充完一个方向后,需要根据当前的填充位置和矩阵的边界来更新 startRow, endRow, startCol, endCol 的值,以便下一次循环能够正确填充下一个区域。

6. 条件判断:代码中使用了 if 语句来判断是否需要改变填充方向,这是为了确保在填充过程中不会出现数组越界的错误。

7. 数值递增:在填充过程中,value 被递增,以确保每个元素的值都是唯一的。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/525980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis: 配置文件详解(Redis.conf)

文章目录 一、Units二、INCLUDES三、NETWORK四、GENERAL五、SECURITY六、LIMITS 一、Units 单位&#xff0c;配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit&#xff0c;大小写不敏感 二、INCLUDES 包含&#xff0c;多…

Linux 学习之路 - 进程篇 - PCB介绍1-标识符

目录 一、基础的命令 <1> ps axj 命令 <2> top 命令 <3> proc 目录 二、进程的标识符 <1>范围 <2>如何获取标识符 <3>bash进程 三、创建进程 一、基础的命令 前面介绍了那么多&#xff0c;但是我们没有观察到进程相关状态&#x…

设计模式之责任链模式讲解

概念&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有对象处理它为止。最匹配的场景应该就是逐层审批的模式。 责任链模式只有两个角色&#xff…

JUC:ThreadPoolExecutor线程池的使用方法

文章目录 ThreadPoolExecutor线程池状态构造方法Executors 工厂方法newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutor 提交任务方法关闭任务方法 ThreadPoolExecutor 线程池状态 线程池用高三位表示状态&#xff0c;第一位为符号位。 TERMINATED > TIDYING …

若依ts版本(vue3+element plus+ts)

1、项目简介 本项目参考若依前后端分离版&#xff0c;前端由[若依vue3]改写为ts版本[ruoyi-web-vue3-ts]&#xff0c;后端对[若依V3.8.7]进行了修改[后端版本分支vue3.ts.3.8.7]&#xff0c;具体文档参见[若依官方文档]。本项目对部分代码做了优化&#xff0c;增加了activiti7…

【随笔】Git 高级篇 -- 提交的技巧(上) rebase commit --amend(十八)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

本地电脑渲染不行怎么解决?自助式渲染助你渲染无忧

有时候&#xff0c;即使购买了昂贵的新电脑&#xff0c;我们也可能会遇到渲染速度缓慢、画质不佳或渲染失败等问题。这些问题可能由多种因素引起。针对该问题&#xff0c;为大家推荐了自助式的渲染&#xff0c;解决你本地电脑渲染不佳问题。 电脑渲染不行原因 新电脑渲染效果不…

电影特效渲染为什么费时间?「瑞云渲染」

影视特效渲染过程通常耗时且资源密集&#xff0c;因为它涉及处理复杂的视觉元素和光影效果。瑞云渲染通过云技术提供解决方案&#xff0c;加快渲染速度并降低成本。简而言之&#xff0c;电影特效渲染之所以费时&#xff0c;是因为其对计算机资源的高需求。 电影特效渲染费时间原…

vs2017离线安装(配合QT5.9.2使用)

以vs2017_Professional版本为例&#xff1a; 一、下载安装包vs2017_Professional.exe&#xff08;在线安装包即可&#xff09; 二、创建在目录&#xff1a;C:\vs2017_Professional_Package&#xff0c;把vs2017_Professional.exe放在该目录下。 ID&#xff1a; Microsoft.Vis…

HCIP-Datacom(H12-821)题库补充(4月7日)

最新 HCIP-Datacom&#xff08;H12-821&#xff09;完整题库请扫描上方二维码访问&#xff0c;持续更新中。 在PIM-DM中&#xff0c;路由器会为被裁剪的下游接口启动一个剪枝定时器&#xff0c;定时器超时后接口就会恢复转发。默认情况下该定时器是多少秒&#xff1f; A&#x…

CASA模型教程

原文链接&#xff1a;CASA&#xff08;Carnegie-Ames-Stanford Approach&#xff09;模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247600635&idx6&sna655a8de570edcaa435d6e917b66d9b3&chksmfa82081ccdf5810a33a778e8771bb116bde9e5a1f795da…

共生共舞的期货黄金和现货黄金

期货黄金&#xff0c;作为一种在金融市场上备受关注的投资工具&#xff0c;其价值与价格走势深受现货黄金市场的直接影响和联动。期货黄金交易&#xff0c;本质上是投资者对未来某一特定时间内黄金价格的预期进行押注&#xff0c;而这背后的逻辑支撑和价格基准正是现货黄金市场…

Mysql底层原理十一:Mvcc

为什么要mvcc&#xff1f; 提高并发度&#xff0c;如果读和写都是通过加锁的方式&#xff0c;并发肯定上不来&#xff0c;通过mvcc来实现写通过加锁&#xff0c;读通过mvcc readView机制 3.9.1 Undo版本链 再重复一遍&#xff0c;页面中的记录存放在用户表空间的数据页中&a…

OpenHarmony实战:物联网解决方案之芯海cst85芯片移植案例

本文介绍基于芯海cst85芯片的cst85_wblink开发板移植OpenHarmony LiteOS-M轻量系统的移植案例。 开发了Wi-Fi连接样例和XTS测试样例&#xff0c;同时实现了wifi_lite, lwip, startup, utils, xts, hdf等部件基于OpenHarmony LiteOS-M内核的适配。 移植架构上采用Board和Soc分…

【随笔】Git 高级篇 -- 相对引用2 HEAD~n(十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

原生小程序开发性能优化指南

性能优化指南 1.骨架屏 业务可以在数据加载完成之前用骨架屏幕来占位&#xff0c;提升体验。 2.包大小优化 减小包中静态资源&#xff0c;例如图片文件&#xff0c;可将图片进行压缩降低文件体积。无用文件、函数、样式剔除。除了部分用于容错的图片必须放在代码包&#xf…

烧坏两块单片机,不知道原因?

没有看你的原理图&#xff0c;以下是造成烧毁芯片的几个环节&#xff1a; 1. 最大的可能性是你的单片机电机控制输出与电机驱动电路没有隔离。 我的经验&#xff0c;使用STM32控制电机&#xff0c;无论是直流电机脉宽调制&#xff0c;还是步进电机控制&#xff0c;控制电路与…

耐压40V、输出电压1.23-37V可调,适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。

一、应用领域 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。 二、功能介绍 D1509是一款输入耐压40V、输出电压1.23-37V可调、输出电流最大2.0A的高效率、高精度DC-DC芯片&#xff0c;其输出电压有固定3.3V、5.0V和12.0V的版本&#xff0c;可以为客户省去…

前端自动化测试-Jest

前端自动化测试 Jest官网&#xff1a;https://jestjs.io 安装方式 npm install --save-dev jest yarn add --dev jest cnpm add --save-dev jest 使用方法 所有以 .test.js 结尾的都是测试文件 基础用法示例 num.js&#xff1a; export function getSum (a, b) {return a b…

go语言实现无头单向链表

什么是无头单向链表 无头单向链表是一种线性数据结构&#xff0c;它的每个元素都是一个节点&#xff0c;每个节点都有一个指向下一个节点的指针。"无头"意味着这个链表没有一个特殊的头节点&#xff0c;链表的第一个节点就是链表的头。 优点&#xff1a; 动态大小&…