【数据结构与算法】力扣 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图像 在之前的文章学习到,计算机只能处理数字图像,因…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
