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

【LeetCode】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.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

思路分析:

  1. 初始化边界
    首先,我们需要定义四个边界变量,分别表示矩阵的上边界(top)、下边界(bottom)、左边界(left)和右边界(right)。初始时,这些边界分别设置为矩阵的第一行、最后一行、第一列和最后一列。

  2. 循环遍历
    使用一个循环来遍历矩阵的边界。在每次循环中,我们按照顺时针的顺序遍历矩阵的四个边界(上、右、下、左),并将遍历到的元素添加到结果列表中。

  3. 更新边界
    在遍历完每个边界后,我们需要根据遍历的方向来更新相应的边界变量。具体来说:

    • 遍历完上边界后,上边界下移(top++)。
    • 遍历完右边界后,右边界左移(right--)。
    • 遍历完下边界后,下边界上移(bottom--)。
    • 遍历完左边界后,左边界右移(left++)。
  4. 终止条件
    循环会一直进行,直到四个边界交叉,即左边界超过右边界(left > right)或上边界超过下边界(top > bottom)。这时,表示矩阵中的所有元素都已经被遍历完毕,可以结束循环。

  5. 返回结果
    循环结束后,返回存储了按顺时针螺旋顺序遍历的矩阵元素的结果列表。

        注意,在遍历右边界和下边界时,需要添加一个检查来确保内部还有元素需要遍历。这是因为当矩阵的行数或列数为奇数时,遍历完上边界和左边界后,右边界或下边界可能只剩下单独的一行或一列。如果不进行检查,就会在这一行或一列上重复遍历,导致结果错误。

代码实现:

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> result = new ArrayList<>(); // 初始化结果列表  if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {  // 如果矩阵为空或没有行/列,则直接返回空的结果列表  return result;  }  int left = 0, right = matrix[0].length - 1; // 初始化左右边界  int top = 0, bottom = matrix.length - 1; // 初始化上下边界  while (left <= right && top <= bottom) {  // 遍历上边界  for (int i = left; i <= right; i++) {  result.add(matrix[top][i]); // 将上边界的元素添加到结果列表中  }  top++; // 上边界下移  // 遍历右边界  for (int i = top; i <= bottom; i++) {  result.add(matrix[i][right]); // 将右边界的元素添加到结果列表中  }  right--; // 右边界左移  // 检查是否还有内部元素需要遍历(避免在只剩一行或一列时重复遍历)  if (top <= bottom) {  // 遍历下边界  for (int i = right; i >= left; i--) {  result.add(matrix[bottom][i]); // 将下边界的元素添加到结果列表中  }  bottom--; // 下边界上移  }  if (left <= right) {  // 遍历左边界  for (int i = bottom; i >= top; i--) {  result.add(matrix[i][left]); // 将左边界的元素添加到结果列表中  }  left++; // 左边界右移  }  }  return result; // 返回结果列表  }
}

相关文章:

【LeetCode】54. 螺旋矩阵

螺旋矩阵 题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a;…...

计算机毕业设计 奖学金评定管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

【JavaWeb项目】——外卖订餐系统之商家添加餐品、修改餐品、查询热卖餐品、查询出售车、进行发货操作

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…...

制作抖音私信卡片 - 一键调起并跳转微信二维码

抖音私信图文卡片&#xff0c;点击可以直接一键添加微信 可生成无风险链接&#xff0c;使用苹果手机转发创建出卡片 抖音内点击可以直接调起微信跳入小程序展示微信二维码...

赋能未来园区:TSINGSEE视频AI智能管理平台如何引领园区管理智慧化转型

一、建设背景 随着经济的不断发展&#xff0c;园区产业集聚发展已成为趋势&#xff0c;园区逐渐成为产业聚集的重要载体。目前&#xff0c;国内现有的大部分园区的管理方式比较粗放、单一&#xff0c;范围局限于安全、环境等方面且不成体系&#xff0c;并且没有覆盖到应急、消…...

Linux逻辑卷管理LVM

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 1.Linux介绍、目录结构、文件基本属性、Shell 2.Linux常用命令 3.Linux文件管理 4.Linux 命令安装(rpm、install) 5.Linux账号管理 6.Linux文件/目录权限管理 7.Linux磁盘管理/文件系统 提示&a…...

团队诊断工具TDS

希典梁开广老师引进的团队诊断问卷TDS(Team Diagnostic Survey)是基于卓越团队6个条件模型开发的&#xff0c;是用于诊断团队有效性的测评工具&#xff0c;其建构过程严格遵循心理测量学原理。可以帮助企业觉察团队优劣势&#xff0c;找到提升与发展机会&#xff0c;明确和强化…...

DC-5靶机渗透测试

DC-5靶场 文章目录 DC-5靶场信息收集漏洞发现漏洞利用 --- 日志文件包含漏洞利用 --- 文件包含过滤器链的RCEshell反弹权限提升 信息收集 使用--scriptvuln扫描发现了一个thankyou.php界面 感觉会有问题&#xff0c;前往访问网站信息 漏洞发现 来到thankyou.php界面&#xff…...

16、电科院FTU检测标准学习笔记-基本性能2

作者简介&#xff1a; 本人从事电力系统多年&#xff0c;岗位包含研发&#xff0c;测试&#xff0c;工程等&#xff0c;具有丰富的经验 在配电自动化验收测试以及电科院测试中&#xff0c;本人全程参与&#xff0c;积累了不少现场的经验 ———————————————————…...

MySQL——使用Python操作MySQL

文章目录 安装PyMySQL使用PyMySQL操作MySQL 在Python中操作MySQL数据库时&#xff0c;我们使用较多的库是 PyMySQL,如果你选择使用 PyMySQL库&#xff0c;那么首先需要通过pip安装它。pip install pymysql命令就是用来安装PyMySQL的。 安装PyMySQL 1.打开你的命令行工具&…...

Flink的DataStream状态管理

目录 键控数据流(Keyed DataStream) 键控状态(Keyed State) 值状态(ValueState) 列表状态(ListState) 归约状态(ReducingState) 聚合状态(AggregatingState) 映射状态(MapState) 状态生存时间(TTL) 算子状态(Operator State) 广播状态(Broadcast S…...

Daiqile SQL注入绕过

上源码。 <?php header("Content-type: text/html; charsetutf-8"); require db.inc.php;function dhtmlspecialchars($string) {if (is_array($string)) {foreach ($string as $key > $val) {$string[$key] dhtmlspecialchars($val);}}else {$string str_…...

用Python轻松移除PDF中的注释

PDF文档因其跨平台的兼容性和格式稳定性而备受青睐。然而&#xff0c;随着文档在不同用户间的流转&#xff0c;累积的注释可能会变得杂乱无章&#xff0c;甚至包含敏感或过时的信息&#xff0c;这不仅影响了文档的清晰度和专业性&#xff0c;还可能引发隐私风险。因此&#xff…...

51单片机—串口

一、 串口基本认知 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方 式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简 单&a…...

vue 通过 this.$refs 创建方法i向子组件传参让子组件更新

在Vue中&#xff0c;this.$refs主要用于访问子组件的实例或者DOM元素。通过this.$refs&#xff0c;你可以调用子组件的方法或者访问其数据属性&#xff0c;从而实现子组件的更新。以下是一些使用this.$refs向子组件传参并触发更新的常见方法&#xff1a; 1. 直接调用子组件的方…...

Java设计模式以及代理模式

一、设计模式 1.JAVA六大设计原则 JAVA设计模式提供六个基本原则&#xff0c;分别是&#xff1a; 开闭原则(OCP) - The Open-Closed Principle单一职责原则(SRP) - Single Responsibility Principle里氏替换原则(LSP) - Liskov Substitution Principle依赖倒置原则(DIP) - D…...

Elasticsearch 索引库管理:查询、修改与删除

Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎&#xff0c;它允许用户通过 RESTful API 进行数据的索引、搜索、更新和管理。在 Elasticsearch 中&#xff0c;索引库&#xff08;Index&#xff09;是存储数据的基本单元。本文将介绍如何查询、修改和删除 Elasticsea…...

视频大怎么压缩小?分享3种视频压缩方法

视频大怎么压缩小&#xff1f;视频文件过大时&#xff0c;压缩视频不仅能帮助我们节省宝贵的存储空间&#xff0c;使其更容易在有限容量的设备中保存&#xff0c;还能显著提升传输效率&#xff0c;特别是在网络条件有限或需要快速分享视频内容的场合。通过专业的压缩工具&#…...

springboot项目搭建集成 redis/跨域/远程请求

目录 一&#xff0c;创建maven项目 1&#xff0c;左上角file > new > maven project 2&#xff0c;next 到 创建 Group id 和 Artifact id​编辑​编辑 二&#xff0c;配置springboot 1&#xff0c;配置pom文件&#xff0c; 2&#xff0c;创建启动类 3&#xff…...

lvs详解及实例配置

目录 1.什么是负载均衡 1.1为什么用负载均衡 1.2.负载均衡类型 1.2.1.四层负载均衡 1.2.2.七层负载均衡 1.3 四层和七层的区别 2.LVS介绍 2.1LVS 的优势与不足 2.2LVS 核心组件和专业术语 3.ipvsadm命令 4.LVS集群中的增删改 4.1.管理集群服务中的增删改 4.2.管理集…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...