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 被递增,以确保每个元素的值都是唯一的。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

conda在【已有环境】上新建虚拟环境

在做Python工程时&#xff0c;经常遇到的一个问题就是&#xff1a;为了复现某个项目需要特地新建一个虚拟环境。但是&#xff0c;我们两个Project需要的环境几乎相同&#xff0c;只是有少数模块的版本互斥&#xff0c;这个时候都从0装一遍虚拟环境&#xff0c;就比较耽误时间。…

VMware启动显示“打开虚拟机时出错: 获取该虚拟机的所有权失败”

提示框&#xff08;忘截图了&#xff09;里提示目录C:\Users\mosep\Documents\Virtual Machines\VM-Win10 x64\中的某个文件&#xff08;在我这里好像是VM-Win10 x64.vmx&#xff0c;VM-Win10 x64是我给虚拟机取的名字&#xff09;在被使用中。 找到这个目录&#xff0c;删除.…

【面试题】如何在亿级别用户中检查用户名是否存在?

前言 不知道大家有没有留意过&#xff0c;在使用一些app或者网站注册的时候&#xff0c;提示你用户名已经被占用了&#xff0c;比如我们熟知的《英雄联盟》有些人不知道取啥名字&#xff0c;干脆就叫“不知道取啥名”。 但是有这样困惑的可不止他一个&#xff0c;于是就出现了“…

如何从应用商店Microsoft Store免费下载安装HEVC视频扩展插件

在电脑上打开一张HEIC类型的图片提示缺少HEVC解码器&#xff0c;无法打开查看&#xff0c;现象如下&#xff1a; 这种情况一般会提示我们需要下载安装HEVC解码器&#xff0c;点击“立即下载并安装”会跳转到应用商店&#xff0c;但是我们发现需要付费7元才能下载安装 免费安装…

6. Z 字形变换(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如…

mac | Windows 本地部署 Seata2.0.0,Nacos 作为配置中心、注册中心,MySQL 存储信息

1、本人环境介绍 系统 macOS sonama 14.1.1 MySQL 8.2.0 &#xff08;官方默认是5.7版本&#xff09; Seata 2.0.0 Nacos 2.2.3 2、下载&数据库初始化 默认你已经有 Nacos、MySQL&#xff0c;如果没有 Nacos 请参考我的文章 &#xff1a; Docker 部署 Nacos&#xff08;单机…

订阅edk2社区邮件列表

给社区发邮件步骤 UEFI订阅邮件列表 开发者订阅邮箱 develedk2.groups.io | Home 点击Join This Group&#xff0c;按照步骤填写自己邮箱地址&#xff08;该地址是edk2,发送邮件到该邮箱的地址&#xff09; 自己邮箱确认就可以自动收到邮件了 比如&#xff1a;

虚拟串口工具vspd.exe的使用

关于vspd虚拟串口工具的获取&#xff1a; 工具下载 &#xff08;1、 虚拟串口工具官方下载链接 2、通过本文资源下载&#xff09;工具按照步骤&#xff08;过于简单&#xff0c;此处省略&#xff09; 关于vspd虚拟串口工具的使用&#xff1a; 打开软件&#xff0c;如下&…

鸡哥的蛋糕大作战(蓝桥杯)

文章目录 鸡哥的蛋糕大作战问题描述模拟 鸡哥的蛋糕大作战 问题描述 鸡哥是一位著名的糕点师傅&#xff0c;他特别擅长做各种形状的蛋糕。他有一种特殊的蛋糕制作方法&#xff0c;那就是在蛋糕上开洞。有一天&#xff0c;他想到一个有趣的想法&#xff1a;不同的数字可以代表…

Ethernet 汇总

Ethernet系统 硬件最小系统 CPU:可以是复杂的芯片,也可以是小的单片机DMA:用于减轻CPU负担,搬运数据系统Memory<->FIFOMAC:可以集成在芯片里面,用于CPU和PHY之间的通信MII:接口用于MAC和PHY的通信,包括控制MDIO和数据DataPHY:模拟器件,最底层,数据收发源头软件…

【json.dump()】的用法和【pickle.dump()】的用法

json.dump()写入 json.dump() 函数用于将 Python 对象序列化为 JSON 格式的字符串,并将该字符串写入文件。它接受两个参数:要序列化的 Python 对象和要写入的文件对象。 下面是 json.dump() 函数的基本用法示例: import json# 要序列化的 Python 对象 data = {"name…

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

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

【Vue】Vue3开发从入门到实战目录【最新版本vue3+typescript前端开发教程】

Vue3开发从入门到实战目录 1. vue3简介与环境配置 2. 创建vue3项目 3. 我的第一个组件 4. 编写简单页面效果 5. OptionsAPI与CompositionAPI 6. setup概述与使用 7. ref基本类型的响应式数据 8. ref对象类型的响应式数据 9. reactive对象类型的响应式数据 10…

Node.js从基础到高级运用】二十二、同步执行的子进程

引言 在 Node.js 的应用程序中&#xff0c;我们有时候需要在父进程中同步地执行子进程&#xff0c;这对于需要顺序执行任务或者处理命令行工具的输出特别有用。child_process 模块在 Node.js 中用于创建子进程&#xff0c;并且提供了几种同步执行子进程的方法。在 Windows 系统…

MongoDB主从复制模式基于银河麒麟V10系统

MongoDB主从复制模式基于银河麒麟V10系统 背景介绍 MongoDB自4.0版本开始已经不再建议使用传统的master/slave复制架构,而是全面采用了复制集(Replica Sets)作为标准的复制和高可用性解决方案。 复制集是MongoDB的一种数据复制和高可用性机制,通过异步同步数据至多个服务…

为什么企业推广需要品牌故事?媒介盒子分享

从时代来看&#xff0c;我们正处“信息超载的商业时代”&#xff0c;品牌传播面临着“产品同质化”和“信息超载化”的困境。近日小米SU7的出圈除了汽车本身的话题度外&#xff0c;离不开小米的品牌故事、创始人雷军的话题等等。今天媒介盒子就来和大家聊聊&#xff1a;为什么企…

postgresql发布和订阅

一、发布订阅介绍 发布和订阅使用了pg的逻辑复制的功能&#xff0c;通过发布端创建publication与表绑定&#xff0c;订阅端创建subscription同时会在发布端创建逻辑复制槽实现逻辑复制功能 逻辑复制基于 发布&#xff08;Publication&#xff09; 与 订阅&#xff08;Subscri…

【go】模板展示不同k8s命名空间的deployment

gin模板展示k8s命名空间的资源 这里学习如何在前端单页面&#xff0c;调用后端接口展示k8s的资源 技术栈 后端 -> go -> gin -> gin模板前端 -> gin模板 -> html jsk8s -> k8s-go-client &#xff0c;基本资源(deployment等) 环境 go 1.19k8s 1.23go m…

Idea调试热更新那些事

用惯了Eclipse,对于eclipse的调试过程中HotSwap生效感觉很爽&#xff0c;更换为IDEA后&#xff0c;总觉得别扭得很&#xff0c;非要手动触发“Recompile *.java"这个才能生效。最开始老是感觉我哪里理解不到位&#xff0c;或者我的环境配置哪里有问题&#xff0c;反正就是…

根据生辰八字四柱命理测算童子命童子煞算法

#小李子9479# #不讲废话# 真童子命算法口诀: 1。春秋寅子贵 //命造生在春季或秋季的(以月令算),日支或时支见寅或子的2。冬夏卯未辰 //命造生在冬季或夏季的(以月令算),日支或时支见卯、未或辰的3。金木马卯和 //年柱纳音为金或木的,日支或时支见午或卯的4。水火遇鸡…