leetcode--螺旋矩阵
LCR 146.螺旋遍历二维数组
给定一个二维数组
array,请返回「螺旋遍历」该数组的结果。螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。
示例 1:
输入:array = [[1,2,3],[8,9,4],[7,6,5]] 输出:[1,2,3,4,5,6,7,8,9]示例 2:
输入:array = [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]] 输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]限制:
0 <= array.length <= 1000 <= array[i].length <= 100
原理
初始化边界:
- north, south, east, west 分别表示二维数组的上、下、右、左边界。开始时,
north = 0,south = array.length - 1,east = array[0].length - 1,west = 0,即全覆盖数组的外边界。螺旋遍历:
螺旋遍历从左上角(
north, west)开始,顺时针按“右、下、左、上”的顺序遍历二维数组。第一步: 从左到右遍历,即遍历当前的北边界行。
第二步: 从上到下遍历,即遍历当前的东边界列。
第三步: 从右到左遍历,即遍历当前的南边界行。
第四步: 从下到上遍历,即遍历当前的西边界列。
每一轮螺旋遍历后,都会减少遍历区域的边界:
north++:上边界下移west++:左边界右移south--:下边界上移east--:右边界左移这样,每完成一圈遍历,内层的元素逐步被收录,直到所有元素都被遍历完。
终止条件:
- 当
sum(剩余未遍历元素的数量)为 0 时,表示所有元素都已被访问完,跳出循环。返回结果:
- 最终,
list数组包含了螺旋遍历的所有元素,按顺序返回。时间复杂度:
- 假设数组的维度是
m x n,遍历所有元素的时间复杂度是O(m * n),因为每个元素都只会被访问一次。空间复杂度:
- 空间复杂度为
O(m * n),因为需要一个大小为m * n的数组来存储遍历的结果。
代码
class Solution {public int[] spiralArray(int[][] array) {// 获取二维数组的行数,即南边界int south = array.length - 1; // 如果数组没有行,直接返回空数组if (south == -1) {return new int[0];}// 获取二维数组的列数,即东边界int east = array[0].length - 1; // 如果数组没有列,直接返回空数组if (east == -1) {return new int[0];}// 计算二维数组中的总元素个数,决定返回数组的大小int sum = (south + 1) * (east + 1); // 初始化边界int north = 0, west = 0;// 创建存储结果的数组int[] list = new int[sum];// count 用来记录当前插入的位置int count = 0;// 开始螺旋遍历while (sum > 0) {// 从左到右遍历(沿着北边界)for (int i = west; i <= east; i++) {list[count++] = array[north][i]; // 将当前元素加入结果数组sum--; // 每遍历一个元素,减去一个}// 如果所有元素已经遍历完,跳出循环if (sum == 0) {break;}// 从上到下遍历(沿着东边界)for (int i = north + 1; i <= south; i++) {list[count++] = array[i][east]; // 将当前元素加入结果数组sum--; // 每遍历一个元素,减去一个}// 如果所有元素已经遍历完,跳出循环if (sum == 0) {break;}// 从右到左遍历(沿着南边界)for (int i = east - 1; i >= west; i--) {list[count++] = array[south][i]; // 将当前元素加入结果数组sum--; // 每遍历一个元素,减去一个}// 如果所有元素已经遍历完,跳出循环if (sum == 0) {break;}// 从下到上遍历(沿着西边界)for (int i = south - 1; i > north; i--) {list[count++] = array[i][west]; // 将当前元素加入结果数组sum--; // 每遍历一个元素,减去一个}// 更新边界,进入内层north++;west++;south--;east--;}// 返回螺旋遍历的结果return list;}
}
54.螺旋矩阵
给你一个
m行n列的矩阵matrix,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:
m == matrix.lengthn == matrix[i].length1 <= m, n <= 10-100 <= matrix[i][j] <= 100
原理
初始化边界:
- north, south, east, west 分别表示二维数组的上、下、右、左边界。开始时,
north = 0,south = matrix.length - 1,east = matrix[0].length - 1,west = 0,即全覆盖矩阵的外边界。螺旋遍历:
螺旋遍历从左上角(
north, west)开始,顺时针按“右、下、左、上”的顺序遍历二维矩阵中的元素。第一步: 从左到右遍历,即遍历当前的北边界行。
第二步: 从上到下遍历,即遍历当前的东边界列。
第三步: 从右到左遍历,即遍历当前的南边界行。
第四步: 从下到上遍历,即遍历当前的西边界列。
每完成一圈螺旋遍历后,都会更新边界:
north++:上边界下移west++:左边界右移south--:下边界上移east--:右边界左移这样,每完成一圈遍历,内层的元素逐步被收录,直到所有元素都被遍历完。
终止条件:
- 当
sum(剩余未遍历元素的数量)为 0 时,表示所有元素都已被访问完,跳出循环。返回结果:
- 最终,
list列表包含了矩阵的螺旋顺序遍历结果,按顺序返回。时间复杂度:
- 假设矩阵的维度是
m x n,遍历所有元素的时间复杂度是O(m * n),因为每个元素只会被访问一次。空间复杂度:
- 空间复杂度为
O(m * n),因为需要一个大小为m * n的列表来存储遍历的结果。
代码
class Solution {public List<Integer> spiralOrder(int[][] matrix) {// 获取矩阵的南边界(即最后一行的索引)int south = matrix.length - 1;// 获取矩阵的东边界(即最后一列的索引)int east = matrix[0].length - 1;// 计算矩阵中元素的总数int sum = (south + 1) * (east + 1);// 初始化边界,north 是上边界,west 是左边界int north = 0, west = 0;// 用一个列表来存储螺旋遍历的结果List<Integer> list = new ArrayList<>(south * east);// 螺旋遍历开始,直到所有元素都被访问while (sum > 0) {// 1. 从左向右遍历(沿着北边界)for (int i = west; i <= east; i++) {list.add(matrix[north][i]); // 将当前元素加入结果列表sum--; // 减少未访问的元素数目}// 如果所有元素已经遍历完,退出循环if (sum == 0) {break;}// 2. 从上到下遍历(沿着东边界)for (int i = north + 1; i <= south; i++) {list.add(matrix[i][east]); // 将当前元素加入结果列表sum--; // 减少未访问的元素数目}// 如果所有元素已经遍历完,退出循环if (sum == 0) {break;}// 3. 从右向左遍历(沿着南边界)for (int i = east - 1; i >= west; i--) {list.add(matrix[south][i]); // 将当前元素加入结果列表sum--; // 减少未访问的元素数目}// 如果所有元素已经遍历完,退出循环if (sum == 0) {break;}// 4. 从下到上遍历(沿着西边界)for (int i = south - 1; i > north; i--) {list.add(matrix[i][west]); // 将当前元素加入结果列表sum--; // 减少未访问的元素数目}// 更新边界,进入内层north++; // 上边界下移west++; // 左边界右移south--; // 下边界上移east--; // 右边界左移}// 返回螺旋遍历的结果return list;}
}
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 x n的矩阵ans。- 用
sum变量记录当前要填充的数字,从 1 开始递增。- 使用
row和column变量来指示当前的矩阵填充位置。螺旋顺序填充:
- 每一圈的填充包括四个方向:向右、向下、向左、向上,依次填充矩阵的边界。
- 向右: 从当前的
(row, column)开始,向右填充n个位置。- 向下: 在完成右边的填充后,向下填充
n-1个位置。- 向左: 完成下边的填充后,向左填充
n-2个位置。- 向上: 完成左边的填充后,向上填充
n-3个位置。每次一圈填充后,更新边界,将
n减少 2,以保证下一圈填充在内层矩阵中进行。边界收缩:
- 每次完成一圈的填充后,
column++将列向右移动,准备进行下次填充。- 同时
n -= 2,表示当前有效矩阵的边长减少 2,从而让填充继续进行到内层。终止条件:
- 当
n <= 0时,表示已经填充完所有的元素,退出循环并返回结果矩阵。时间复杂度:
- 假设矩阵的大小为
n x n,所有元素都需要被遍历一次并填充。因此时间复杂度为 O(n²)。空间复杂度:
- 需要一个
n x n的矩阵来存储结果,因此空间复杂度为 O(n²)。
代码
class Solution {public int[][] generateMatrix(int n) {// 初始化一个 n x n 的矩阵int[][] ans = new int[n][n];// sum 用来记录当前填充的数字,初始为 1int sum = 1;// row 和 column 用来记录当前要填充的位置的行和列int row = 0, column = 0;// 只要 n > 0,就继续填充while (n > 0) {// 1. 从左到右填充当前的北边界for (int i = 0; i < n; i++) {ans[row][column++] = sum++; // 填充当前元素,并将列加 1}// 向左回退一列,因为 column++ 会使列超出范围column -= 1;// 2. 从上到下填充当前的东边界for (int i = 0; i < n - 1; i++) {ans[++row][column] = sum++; // 填充当前元素,并将行加 1}// 3. 从右到左填充当前的南边界for (int i = n - 2; i >= 0; i--) {ans[row][--column] = sum++; // 填充当前元素,并将列减 1}// 4. 从下到上填充当前的西边界for (int i = n - 2; i > 0; i--) {ans[--row][column] = sum++; // 填充当前元素,并将行减 1}// 回到上边界的下一列,并且减少矩阵的规模(边界收缩)column++;n -= 2; // 每一圈填充完成后,矩阵的有效边长减少 2}// 返回生成的矩阵return ans;}
}
相关文章:
leetcode--螺旋矩阵
LCR 146.螺旋遍历二维数组 给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。 螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元…...
JavaScript(JS)的对象
目录 1.array 数组对象 2.String 字符串对象 3.JSON 对象(数据载体,进行数据传输) 4.BOM 浏览器对象 5.DOM 文档对象(了解) 1.array 数组对象 定义方式1:var 变量名 new Array(元素列表); 定义方式…...
基于BM1684的AI边缘服务器-模型转换,大模型一体机
介绍 我们属于SoC模式,即我们在x86主机上基于tpu-nntc和libsophon完成模型的编译量化与程序的交叉编译,部署时将编译好的程序拷贝至SoC平台(1684开发板/SE微服务器/SM模组)中执行。 注:以下都是在Ubuntu20.04系统上操…...
git推送多个仓库
在 Git 中,可以通过添加多个远程仓库来实现一次 git push 推送到多个仓库,比如同时推送到 Gitee 和 GitHub。以下是详细的设置步骤: 1. 添加多个远程仓库 假设你的项目已经有一个远程仓库(例如 GitHub),你…...
Matlab mex- setup报错—错误使用 mex,未检测到支持的编译器...
错误日志: 在使用mex编译时报错提示:错误使用 mex,未检测到支持的编译器。您可以安装免费提供的 MinGW-w64 C/C 编译器;请参阅安装 MinGW-w64 编译器。有关更多选项,请访问https://www.mathworks.com/support/compile…...
PostgreSQL认证培训需要什么条件
PostgreSQL认证培训通常没有严格的前置条件,但以下几点可以帮助你更好地准备和通过认证考试: 1、基础知识:具备基本的数据库知识和经验,特别是对SQL有一定的了解。如果你Oracle、MySQL等基础知识,对对你学习PostgreSQ…...
Oracle—系统包使用
文章目录 系统包dbms_redefinition 系统包 dbms_redefinition 功能介绍:该包体可以实现将Oracle库下的表在线改为分区结构或者重新定义; 说明:在检查表是否可以重定义和开始重定义的过程中,按照表是否存在主键,参数 o…...
【排序用法】.NET开源 ORM 框架 SqlSugar 系列
💥 .NET开源 ORM 框架 SqlSugar 系列 🎉🎉🎉 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列…...
【SpringBoot】整合篇
1、log4j2 第一步,导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions><!-- 去掉springboot默认配置 --> <exclusion> <…...
写入json和读取json文件
/// <summary> ///写入文件 /// </summary> /// <param name"Stns"></param> /// <returns></returns> public ActionResult WriteJsonFile(string Stns) { strin…...
Vuex的理解及使用场景
Vuex 是 Vue.js 应用中一个专门为状态管理而设计的库,它基于 Fluts 和 Redux 的模式。Vuex 提供了一种集中式存储管理所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。以下是 Vuex 的理解及使用场景: Vuex 的理解 核心概…...
PostGis学习笔记
– 文本方式查看几何数据 SELECT ST_AsText(geom)FROM nyc_streets WHERE name ‘Avenue O’; – 计算紧邻的街区 SELECT name,ST_GeometryType(geom) FROM nyc_streets WHERE ST_DWithin( geom,ST_GeomFromText(‘LINESTRING(586782 4504202,586864 4504216)’,26918),0.1); …...
Qt 窗口类型、窗口标志和窗口属性
一、窗口类型 Qt 窗口标志枚举类型用于指定小部件的各种窗口系统属性。其中一些标志取决于底层窗口管理器是否支持它们。以下是窗口类型: Qt::QWidget:这是 QWidget 的默认类型。如果它们有父级,这种类型的部件是子部件,如果没有父控件,则为独立窗口。Qt::Window:通常具…...
相机学习笔记——工业相机的基本参数
0、相机分类 图像颜色不同可以分为黑白相机和彩色相机:相同分辨率下,黑白工业相机相比彩色工业相机精度更高,检测图像边缘时,黑白工业相机成像效果更好。 芯片类型不同可以分为CCD相机和CMOS相机:CCD工业相机具有体积小…...
MATLAB - ROS2 ros2genmsg 生成自定义消息(msg/srv...)
系列文章目录 前言 语法 ros2genmsg(folderpath)ros2genmsg(folderpath,Name=Value) 一、说明 ros2genmsg(folderpath) 通过读取指定文件夹路径下的 ROS 2 自定义信息和服务定义来生成 ROS 2 自定义信息。函数文件夹必须包含一个或多个 ROS 2 软件包。这些软件包包含 .msg 文…...
【Git 操作】-- 将 fork master 分支的最新commit更新到自己的仓库
目录 1.举例 2. 配置上游仓库(Upstream) 3. 获取上游仓库的更新 4. 切换到你自己的 master 分支 5. 合并上游仓库的 master 分支 6. 解决冲突(如果有的话) 7. 推送更新到你自己的 GitHub 仓库 1.举例 当我们从 github 的 h…...
[高等数学学习记录] 泰勒公式
1 知识点 1.1 要求 为简化计算, 通常用多项式近似表达复杂函数: 设函数 f ( x ) f(x) f(x) 在含有 x 0 x_0 x0 的开区间内具有 ( n 1 ) (n1) (n1) 阶导数, 试找出一个关于 ( x − x 0 ) (x-x_0) (x−x0) 的 n n n 次多项式 p n ( x ) p_n(x) pn(x) 近似表达 f…...
我的创作纪念日—128天的坚持|分享|成长
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...
万字长文解读深度学习——多模态模型BLIP2
🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总 万字长…...
selinux与防火墙
selinux 什么是selinux SELinux 是 Security-Enhanced Linux 的缩写,意思是安全强化的 linux 。 SELinux 主要由美国国家安全局( NSA )开发,当初开发的目的是为了避免资源的误用。 系统资源都是通过程序进行访问的࿰…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...


