当前位置: 首页 > news >正文

【数据结构与算法】力扣 59. 螺旋矩阵 II

题目描述

给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 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 填充表示未填充的位置。

  • 定义边界:topbottomleftright,分别代表当前矩阵的上、下、左、右边界。

  • 用一个变量 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;
};

思路拓展

螺旋矩阵相关的问题,都可以通过一层一层遍历,通过一行一列、一行一列的顺序处理每个元素。

而且遍历过程中一定有一个规律,就是总有一个坐标是不变的,而另一个坐标在变。

解决螺旋矩阵题目时,可以总结出一些通用的解题方法和步骤。这些方法适用于填充矩阵或读取矩阵元素的螺旋顺序。

类似的题型见:螺旋矩阵

通用方法总结

  1. 定义边界变量

    • 使用 topbottomleftright 四个变量来表示当前矩阵的边界。
    • top 表示当前未填充区域的最上边行索引,bottom 表示最下边行索引。
    • left 表示未填充区域的最左边列索引,right 表示最右边列索引。
    • 这些边界变量随着螺旋填充或遍历逐渐收缩,直到遍历完成整个矩阵。
  2. 按照顺时针方向遍历或填充

    • 按照顺时针的顺序进行:从左到右(填充 top 行),从上到下(填充 right 列),从右到左(填充 bottom 行),从下到上(填充 left 列)。
    • 每次填充后,相应地缩小边界(如 top++bottom--left++right--)。
  3. 边界条件判断

    • 在每次填充新的行或列之前,判断当前的 top <= bottomleft <= right,确保当前边界仍然有效,防止重复填充或越界。
    • 这些判断可以避免在矩阵维度不对称时(如奇数维度矩阵)多次填充同一行或列。
  4. 循环控制条件

    • 通常使用一个 while 循环,当填充的数字还未达到矩阵总数 ( n^2 ) 时,继续循环。
    • 如果是读取矩阵中的元素,循环直到所有元素都遍历完。

解决螺旋矩阵问题的通用步骤

  1. 初始化矩阵和边界变量

    • 创建一个合适大小的矩阵,用来存放填充结果。
    • 初始化 topbottomleftright
  2. 进行螺旋顺序填充或读取

    • 按照顺时针顺序进行:从左到右,从上到下,从右到左,从下到上。
    • 每次填充或读取后,收缩相应的边界。
  3. 更新填充条件和检查边界

    • 进行边界检查,确保没有重复填充。
  4. 返回结果

    • 返回填充完的矩阵,或者返回读取顺序得到的结果。

注意事项

  • 边界条件的处理:确保在每次改变边界时进行有效的判断,避免多次填充同一行或列。
  • 初始化矩阵大小:根据题目的输入大小 ( n ) 确保矩阵初始化正确。
  • 边界收缩顺序:每次遍历结束后,适时更新 topbottomleftright 的值。

相关文章:

【数据结构与算法】力扣 59. 螺旋矩阵 II

题目描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a; n 3 输出&#xff1a; [[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&#xff1a…...

HarmonyOS Next模拟器异常问题及解决方法

1、问题1&#xff1a;Failed to get the device apiVersion. 解决方法&#xff1a;关闭模拟器清除用户数据重启...

求最大公约数(c语言)

先看题&#x1f447; 我这里介绍的方法&#xff1a;辗转相除法&#xff1a; 最大公约数&#xff1a; 最大公约数是指同时能整除俩个或更多整数的最大正整数。 欧几里得算法就是求最大公约数的算法 求最大公约数涉及到一个数学原理的转换: 俩个数的最大公约数等于其中一个数和…...

Android Camera2在textureView中的预览和拍照

Camera2预览和拍照 1、Camera2相机模型2、Camera2的重要类3、Camera2调用流程4、Camera2调用实现 1)定义TextureView作为预览界面2)设置相机参数3)开启相机4)开启相机预览5)实现PreviewCallback6)拍照 1、Camera2相机模型 解释上诉示意图&#xff0c;假如想要同时拍摄两张不同…...

Redis的缓存问题

缓存雪崩 定义&#xff1a;缓存雪崩是指在某个时间段内&#xff0c;缓存中的大量数据同时失效或者大量的请求集中到某一个时间点发生&#xff0c;导致数据库压力骤增&#xff0c;甚至引起服务崩溃的现象。 原因&#xff1a;通常是由于缓存中的大量数据同时过期或者大量的请求集…...

C语言小游戏--猜数字

游戏过程&#xff1a; 由电脑随机在某个范围内生成一个数字&#xff0c;玩家猜数字并且输入&#xff0c;电脑判断是否正确&#xff0c;正确则游戏结束&#xff0c;错误则给出提示&#xff0c;直到玩家所给的答案正确为止 思路分析&#xff1a; 1.生成随机数 2.玩家可以多次…...

代理IP在爬虫中的作用是什么?

在爬虫中&#xff0c;代理IP的主要作用包括以下几个方面&#xff1a; 防止IP被封禁&#xff1a;每个网站都有反爬机制&#xff0c;会记录并封禁同一个IP地址的频繁请求。使用代理IP可以让爬虫更换源头&#xff0c;减少被目标网站识别为恶意爬虫的风险。 提高抓取效率&#xff…...

卡尔曼讲解与各种典型进阶MATLAB编程(专栏目录,持续更新……)

专栏链接&#xff1a;https://blog.csdn.net/callmeup/category_12574912.html 文章目录 专栏介绍重点文章卡尔曼滤波的原理卡尔曼滤波的例程 进阶MATLAB编程后续更新 专栏介绍 本专栏旨在深入探讨卡尔曼滤波及其在各类应用中的实现&#xff0c;尤其是通过MATLAB编程进行的典…...

Java项目-基于Springboot的智慧养老平台项目(源码+文档).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、SpringClud、Vue、Mybaits Plus、ELementUI工具&…...

如何测试IP速度?

了解代理的连接速度是否快速是确保网络使用效率和体验的关键因素之一。本文来为大家如何有效地评估和测试代理IP的连接速度&#xff0c;以及一些实用的方法和工具&#xff0c;帮助用户做出明智的选择和决策。 一、如何评估代理IP的连接速度 1. 使用在线速度测试工具 为了快速…...

IDEA使用Alibaba Cloud Toolkit插件自动化部署jar包

一、下载插件 二、添加服务器主机 三、填写自己服务器配置 四、添加配置 五、配置说明 六、选择maven打包模块 七、maven打包后的jar包位置配一下 八、点击运行发现成功...

FFMPEG录屏(19)--- 枚举Windows下的屏幕列表,并获取名称、缩略图

在Windows下枚举显示器列表并获取名称、缩略图 在Windows系统中&#xff0c;枚举显示器列表并获取它们的名称和缩略图是一个常见的需求。本文将详细介绍如何实现这一功能&#xff0c;涉及到的主要技术包括Windows API和C编程。 获取显示器信息 首先&#xff0c;我们需要一个…...

【python】NumPy(三):文件读写

目录 ​前言 NumPy 常见IO函数 save()和load() savez() loadtxt()和savetxt() 练习 前言 在数据分析中&#xff0c;我们经常需要从文件中读取数据或者将数据写入文件&#xff0c;常见的文件格式有&#xff1a;文本文件txt、CSV格式文件&#xff08;用逗号分隔&#xff…...

硬件产品经理的开店冒险之旅(下篇)

缘起&#xff1a;自己为何想要去寻找职业第二曲线 承接上篇的内容&#xff0c;一名工作13年的普通硬件产品经理将尝试探索第二职业曲线。根本原因不是出于什么高大上的人生追求或者什么职业理想主义&#xff0c;就是限于目前的整体就业形式到了40岁的IT从业人员基本不可能在岗…...

基于GeoScene Pro的开源数据治理与二维制图规范化处理智能工具箱

内容导读 本文描述的是一个基于GeoScene Pro4.0/ArcGIS3.1 Pro平台的开源数据治理与二维制图规范化处理智能工具箱(免费试用&#xff0c;文末有获取方式)&#xff0c;旨在解决GIS应用中数据转换、检查、治理和制图数据规范化处理方面的问题。 工具箱结合了Geoscene/ArcGIS Pr…...

CSS 设置网页的背景图片

背景 最近正好在写一个个人博客网站“小石潭记”&#xff0c;需要一张有水&#xff0c;有鱼的图片。正好玩原神遇到了类似场景&#xff0c;于是截图保存&#xff0c;添加到网站里面。以下是效果图&#xff1a; css 写个class&#xff0c;加到整个网页的body上 .bodyBg {ba…...

如何使用DockerSpy检测你的Docker镜像是否安全

关于DockerSpy DockerSpy是一款针对Docker镜像的敏感信息检测与安全审计工具&#xff0c;该工具可以帮助广大研究人员在Docker Hub上检测和搜索自己镜像的安全问题&#xff0c;并识别潜在的泄漏内容&#xff0c;例如身份验证密钥等敏感信息。 功能介绍 1、安全审计&#xff1a…...

数据结构练习题4(链表)

1两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4]…...

【前端】如何制作自己的网站(7)

以下内容接上文。 结合图片的超链接 将img元素作为内容&#xff0c;放在a元素中。即可为图片添加一个超链接。 例如右边的代码&#xff0c;点击头像就会打开“aboutme.html“。 点击右边的图片试试&#xff5e; 两个非文本元素——图片与超链接。 从现在开始&#xff0…...

《数字图像处理基础》学习02-BMP位图文件

目录 一&#xff0c;BMP文件组成 二&#xff0c;使用ultra edit软件查看图像结构 1&#xff0c;ultra edit软件的下载和安装 2&#xff0c;ultra edit打开图像 三&#xff0c;使用matlab显示RGB图像 在之前的文章学习到&#xff0c;计算机只能处理数字图像&#xff0c;因…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...

高抗扰度汽车光耦合器的特性

晶台光电推出的125℃光耦合器系列产品&#xff08;包括KL357NU、KL3H7U和KL817U&#xff09;&#xff0c;专为高温环境下的汽车应用设计&#xff0c;具备以下核心优势和技术特点&#xff1a; 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计&#xff0c;确保在…...

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来&#xff0c;随着我国人口老龄化问题日益严重&#xff0c;独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长&#xff0c;随之而来的是日益突出的老年人问题&#xff0c;尤其是老年人的健康问题&#xff0c;尤其是老年人产生健康问题后&…...

VASP软件在第一性原理计算中的应用-测试GO

VASP软件在第一性原理计算中的应用 VASP是由维也纳大学Hafner小组开发的一款功能强大的第一性原理计算软件&#xff0c;广泛应用于材料科学、凝聚态物理、化学和纳米技术等领域。 VASP的核心功能与应用 1. 电子结构计算 VASP最突出的功能是进行高精度的电子结构计算&#xff…...