【数据结构与算法】力扣 59. 螺旋矩阵 II
题目描述
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入: n = 1
输出: [[1]]
提示:
1 <= n <= 20
分析解答
思路:
-
初始化一个 n×n 的矩阵,用
0填充表示未填充的位置。 -
定义边界:
top、bottom、left和right,分别代表当前矩阵的上、下、左、右边界。 -
用一个变量
num记录当前要填入的数字,从 1 开始。 -
按照顺时针方向填充矩阵,具体顺序为:
- 从左到右填充顶部行,然后将
top边界向下移动。 - 从上到下填充右侧列,然后将
right边界向左移动。 - 从右到左填充底部行,然后将
bottom边界向上移动。 - 从下到上填充左侧列,然后将
left边界向右移动。
- 从左到右填充顶部行,然后将
-
重复上述步骤,直到填满所有位置。
/*** @param {number} n* @return {number[][]}*/
const generateMatrix = function(n) {const matrix = Array.from({ length: n }, () => Array(n).fill(0));let top = 0, bottom = n - 1;let left = 0, right = n - 1;let num = 1;while (num <= n * n) {// 从左到右填充for (let i = left; i <= right; i++) {matrix[top][i] = num++;}top++;// 从上到下填充for (let i = top; i <= bottom; i++) {matrix[i][right] = num++;}right--;// 从右到左填充if (top <= bottom) {for (let i = right; i >= left; i--) {matrix[bottom][i] = num++;}bottom--;}// 从下到上填充if (left <= right) {for (let i = bottom; i >= top; i--) {matrix[i][left] = num++;}left++;}}return matrix;
};
思路拓展
螺旋矩阵相关的问题,都可以通过一层一层遍历,通过一行一列、一行一列的顺序处理每个元素。
而且遍历过程中一定有一个规律,就是总有一个坐标是不变的,而另一个坐标在变。
解决螺旋矩阵题目时,可以总结出一些通用的解题方法和步骤。这些方法适用于填充矩阵或读取矩阵元素的螺旋顺序。
类似的题型见:螺旋矩阵
通用方法总结
-
定义边界变量:
- 使用
top、bottom、left和right四个变量来表示当前矩阵的边界。 top表示当前未填充区域的最上边行索引,bottom表示最下边行索引。left表示未填充区域的最左边列索引,right表示最右边列索引。- 这些边界变量随着螺旋填充或遍历逐渐收缩,直到遍历完成整个矩阵。
- 使用
-
按照顺时针方向遍历或填充:
- 按照顺时针的顺序进行:从左到右(填充
top行),从上到下(填充right列),从右到左(填充bottom行),从下到上(填充left列)。 - 每次填充后,相应地缩小边界(如
top++、bottom--、left++、right--)。
- 按照顺时针的顺序进行:从左到右(填充
-
边界条件判断:
- 在每次填充新的行或列之前,判断当前的
top <= bottom和left <= right,确保当前边界仍然有效,防止重复填充或越界。 - 这些判断可以避免在矩阵维度不对称时(如奇数维度矩阵)多次填充同一行或列。
- 在每次填充新的行或列之前,判断当前的
-
循环控制条件:
- 通常使用一个
while循环,当填充的数字还未达到矩阵总数 ( n^2 ) 时,继续循环。 - 如果是读取矩阵中的元素,循环直到所有元素都遍历完。
- 通常使用一个
解决螺旋矩阵问题的通用步骤
-
初始化矩阵和边界变量:
- 创建一个合适大小的矩阵,用来存放填充结果。
- 初始化
top、bottom、left和right。
-
进行螺旋顺序填充或读取:
- 按照顺时针顺序进行:从左到右,从上到下,从右到左,从下到上。
- 每次填充或读取后,收缩相应的边界。
-
更新填充条件和检查边界:
- 进行边界检查,确保没有重复填充。
-
返回结果:
- 返回填充完的矩阵,或者返回读取顺序得到的结果。
注意事项
- 边界条件的处理:确保在每次改变边界时进行有效的判断,避免多次填充同一行或列。
- 初始化矩阵大小:根据题目的输入大小 ( n ) 确保矩阵初始化正确。
- 边界收缩顺序:每次遍历结束后,适时更新
top、bottom、left和right的值。
相关文章:
【数据结构与算法】力扣 59. 螺旋矩阵 II
题目描述 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入: n 3 输出: [[1,2,3],[8,9,4],[7,6,5]]示例 2: 输入:…...
HarmonyOS Next模拟器异常问题及解决方法
1、问题1:Failed to get the device apiVersion. 解决方法:关闭模拟器清除用户数据重启...
求最大公约数(c语言)
先看题👇 我这里介绍的方法:辗转相除法: 最大公约数: 最大公约数是指同时能整除俩个或更多整数的最大正整数。 欧几里得算法就是求最大公约数的算法 求最大公约数涉及到一个数学原理的转换: 俩个数的最大公约数等于其中一个数和…...
Android Camera2在textureView中的预览和拍照
Camera2预览和拍照 1、Camera2相机模型2、Camera2的重要类3、Camera2调用流程4、Camera2调用实现 1)定义TextureView作为预览界面2)设置相机参数3)开启相机4)开启相机预览5)实现PreviewCallback6)拍照 1、Camera2相机模型 解释上诉示意图,假如想要同时拍摄两张不同…...
Redis的缓存问题
缓存雪崩 定义:缓存雪崩是指在某个时间段内,缓存中的大量数据同时失效或者大量的请求集中到某一个时间点发生,导致数据库压力骤增,甚至引起服务崩溃的现象。 原因:通常是由于缓存中的大量数据同时过期或者大量的请求集…...
C语言小游戏--猜数字
游戏过程: 由电脑随机在某个范围内生成一个数字,玩家猜数字并且输入,电脑判断是否正确,正确则游戏结束,错误则给出提示,直到玩家所给的答案正确为止 思路分析: 1.生成随机数 2.玩家可以多次…...
代理IP在爬虫中的作用是什么?
在爬虫中,代理IP的主要作用包括以下几个方面: 防止IP被封禁:每个网站都有反爬机制,会记录并封禁同一个IP地址的频繁请求。使用代理IP可以让爬虫更换源头,减少被目标网站识别为恶意爬虫的风险。 提高抓取效率ÿ…...
卡尔曼讲解与各种典型进阶MATLAB编程(专栏目录,持续更新……)
专栏链接:https://blog.csdn.net/callmeup/category_12574912.html 文章目录 专栏介绍重点文章卡尔曼滤波的原理卡尔曼滤波的例程 进阶MATLAB编程后续更新 专栏介绍 本专栏旨在深入探讨卡尔曼滤波及其在各类应用中的实现,尤其是通过MATLAB编程进行的典…...
Java项目-基于Springboot的智慧养老平台项目(源码+文档).zip
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、SpringClud、Vue、Mybaits Plus、ELementUI工具&…...
如何测试IP速度?
了解代理的连接速度是否快速是确保网络使用效率和体验的关键因素之一。本文来为大家如何有效地评估和测试代理IP的连接速度,以及一些实用的方法和工具,帮助用户做出明智的选择和决策。 一、如何评估代理IP的连接速度 1. 使用在线速度测试工具 为了快速…...
IDEA使用Alibaba Cloud Toolkit插件自动化部署jar包
一、下载插件 二、添加服务器主机 三、填写自己服务器配置 四、添加配置 五、配置说明 六、选择maven打包模块 七、maven打包后的jar包位置配一下 八、点击运行发现成功...
FFMPEG录屏(19)--- 枚举Windows下的屏幕列表,并获取名称、缩略图
在Windows下枚举显示器列表并获取名称、缩略图 在Windows系统中,枚举显示器列表并获取它们的名称和缩略图是一个常见的需求。本文将详细介绍如何实现这一功能,涉及到的主要技术包括Windows API和C编程。 获取显示器信息 首先,我们需要一个…...
【python】NumPy(三):文件读写
目录 前言 NumPy 常见IO函数 save()和load() savez() loadtxt()和savetxt() 练习 前言 在数据分析中,我们经常需要从文件中读取数据或者将数据写入文件,常见的文件格式有:文本文件txt、CSV格式文件(用逗号分隔ÿ…...
硬件产品经理的开店冒险之旅(下篇)
缘起:自己为何想要去寻找职业第二曲线 承接上篇的内容,一名工作13年的普通硬件产品经理将尝试探索第二职业曲线。根本原因不是出于什么高大上的人生追求或者什么职业理想主义,就是限于目前的整体就业形式到了40岁的IT从业人员基本不可能在岗…...
基于GeoScene Pro的开源数据治理与二维制图规范化处理智能工具箱
内容导读 本文描述的是一个基于GeoScene Pro4.0/ArcGIS3.1 Pro平台的开源数据治理与二维制图规范化处理智能工具箱(免费试用,文末有获取方式),旨在解决GIS应用中数据转换、检查、治理和制图数据规范化处理方面的问题。 工具箱结合了Geoscene/ArcGIS Pr…...
CSS 设置网页的背景图片
背景 最近正好在写一个个人博客网站“小石潭记”,需要一张有水,有鱼的图片。正好玩原神遇到了类似场景,于是截图保存,添加到网站里面。以下是效果图: css 写个class,加到整个网页的body上 .bodyBg {ba…...
如何使用DockerSpy检测你的Docker镜像是否安全
关于DockerSpy DockerSpy是一款针对Docker镜像的敏感信息检测与安全审计工具,该工具可以帮助广大研究人员在Docker Hub上检测和搜索自己镜像的安全问题,并识别潜在的泄漏内容,例如身份验证密钥等敏感信息。 功能介绍 1、安全审计:…...
数据结构练习题4(链表)
1两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3,4]…...
【前端】如何制作自己的网站(7)
以下内容接上文。 结合图片的超链接 将img元素作为内容,放在a元素中。即可为图片添加一个超链接。 例如右边的代码,点击头像就会打开“aboutme.html“。 点击右边的图片试试~ 两个非文本元素——图片与超链接。 从现在开始࿰…...
《数字图像处理基础》学习02-BMP位图文件
目录 一,BMP文件组成 二,使用ultra edit软件查看图像结构 1,ultra edit软件的下载和安装 2,ultra edit打开图像 三,使用matlab显示RGB图像 在之前的文章学习到,计算机只能处理数字图像,因…...
告别模拟器!手把手教你将Flutter App部署到树莓派4B(ARM64 Linux实战)
告别模拟器!手把手教你将Flutter App部署到树莓派4B(ARM64 Linux实战) 在物联网和边缘计算蓬勃发展的今天,开发者越来越需要将现代UI框架的能力延伸到资源受限的嵌入式设备。树莓派4B作为一款性价比极高的ARM64开发板,…...
如何用AGORA数据集快速提升你的3D人体姿态估计模型(附SMPL-X真值使用技巧)
如何用AGORA数据集快速提升你的3D人体姿态估计模型(附SMPL-X真值使用技巧) 在计算机视觉领域,3D人体姿态估计一直是研究热点,但高质量标注数据的获取成本极高。AGORA数据集的出现为这一难题提供了突破性解决方案——它通过高度逼…...
从硬件小白到项目上线:我的第一个STM32物联网项目(小熊派智慧路灯踩坑实录)
从硬件小白到项目上线:我的第一个STM32物联网项目(小熊派智慧路灯踩坑实录) 第一次拿到小熊派开发板时,那种既兴奋又忐忑的心情至今记忆犹新。作为一个刚转行物联网开发的菜鸟,我对着这块印着卡通熊标志的绿色电路板发…...
2024升级版资源捕获工具:猫抓Cat-Catch全解析
2024升级版资源捕获工具:猫抓Cat-Catch全解析 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化时代,网页资源的获取…...
【数据结构与算法】堆(大顶堆小顶堆堆排序)
👨💻 关于作者:会编程的土豆 “不是因为看见希望才坚持,而是坚持了才看见希望。” 你好,我是会编程的土豆,一名热爱后端技术的Java学习者。 📚 正在更新中的专栏: 《数据结构与算…...
Windows 11 系统下 Maven 3.9.0 一站式配置与开发环境集成指南
1. 为什么选择Maven 3.9.0? 如果你正在Windows 11上开发Java项目,Maven绝对是你不可或缺的得力助手。作为一个项目管理和构建工具,Maven能帮你自动下载依赖库、统一项目结构、管理构建生命周期。最新发布的3.9.0版本在性能上有显著提升&#…...
Javy快速入门指南:5分钟学会创建你的第一个WebAssembly JS应用
Javy快速入门指南:5分钟学会创建你的第一个WebAssembly JS应用 【免费下载链接】javy JS to WebAssembly toolchain 项目地址: https://gitcode.com/gh_mirrors/ja/javy Javy 是一个功能强大的 JavaScript 到 WebAssembly 工具链,由 Bytecode All…...
Limine文件系统与分区方案:FAT32、ISO9660、MBR和GPT的完美集成
Limine文件系统与分区方案:FAT32、ISO9660、MBR和GPT的完美集成 【免费下载链接】limine Modern, advanced, portable, multiprotocol bootloader and boot manager. 项目地址: https://gitcode.com/gh_mirrors/li/limine Limine是一款现代化、高级的可移植多…...
从碎片到可信:OpenClaw的任务治理之路
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
ncmdump:破解NCM加密格式,音乐爱好者的格式自由解决方案
ncmdump:破解NCM加密格式,音乐爱好者的格式自由解决方案 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump 问题场景:当你下载的音乐被"锁"在特定设备 你是否…...
