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

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

问题描述

给你一个 mn 列的矩阵 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

分析解答

  • 定义四个边界

    • top 表示当前上边界,初始为 0。
    • bottom 表示当前下边界,初始为 m - 1
    • left 表示当前左边界,初始为 0。
    • right 表示当前右边界,初始为 n - 1
  • 循环遍历矩阵

    • 从左到右遍历顶部边界,然后将 top 下移。
    • 从上到下遍历右边界,然后将 right 左移。
    • 从右到左遍历底部边界(如果还没有遍历过),然后将 bottom 上移。
    • 从下到上遍历左边界(如果还没有遍历过),然后将 left 右移。
function spiralOrder(matrix) {if (matrix.length === 0) return [];const result = [];let top = 0, bottom = matrix.length - 1;let left = 0, right = matrix[0].length - 1;while (top <= bottom && left <= right) {// 从左到右遍历顶部for (let i = left; i <= right; i++) {result.push(matrix[top][i]);}top++;// 从上到下遍历右边界for (let i = top; i <= bottom; i++) {result.push(matrix[i][right]);}right--;// 从右到左遍历底部if (top <= bottom) {for (let i = right; i >= left; i--) {result.push(matrix[bottom][i]);}bottom--;}// 从下到上遍历左边界if (left <= right) {for (let i = bottom; i >= top; i--) {result.push(matrix[i][left]);}left++;}}return result;
}// 测试示例
console.log(spiralOrder([[1,2,3],[4,5,6],[7,8,9]])); // 输出: [1,2,3,6,9,8,7,4,5]
console.log(spiralOrder([[1,2,3,4],[5,6,7,8],[9,10,11,12]])); // 输出: [1,2,3,4,8,12,11,10,9,5,6,7]

遍历矩阵

  • 按顺时针顺序依次遍历上、右、下、左四个边界,将对应的元素添加到结果数组中。
  • 每遍历完一个边界,就缩小对应的边界值,逐渐向内层推进。
  • 使用条件判断来避免重复遍历同一行或同一列。

if (top <= bottom)if (left <= right) 的作用:

  1. if (top <= bottom) 的作用

    • 当从左到右遍历完 top 行,以及从上到下遍历完 right 列后,会将 bottom 行从右到左遍历。
    • 然而,有可能在遍历 top 行之后,top 已经超过了 bottom(说明已经没有未遍历的行),所以需要先判断 top <= bottom 是否成立。如果不成立,说明不需要再遍历 bottom 行,避免重复处理。
  2. if (left <= right) 的作用

    • 当从右到左遍历完 bottom 行后,会将 left 列从下到上遍历。
    • 同理,如果在遍历 right 列之后,left 已经超过了 right(说明已经没有未遍历的列),那么就不需要再遍历 left 列。因此,先判断 left <= right 是否成立。

复杂度分析

  • 时间复杂度:O(m×n)O(m \times n)O(m×n),因为每个元素会被访问一次。
  • 空间复杂度:O(1)O(1)O(1),除了返回结果外,额外使用的空间是常数级别。

思路拓展

相关文章:

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

问题描述 给你一个 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; 输入&#xff1a; ma…...

速通不了的人工智能

下面是一个详细且系统的人工智能学习框架,涵盖了从基础理论到实际应用的各个方面。这个框架包括理论学习、编程实践、项目实战和资源推荐。为了帮助你更好地理解和应用,我会提供一些具体的代码示例。 人工智能学习框架 1. 基础理论 1.1 数学基础 线性代数:向量、矩阵、特…...

微信新功能上线,找工作也能“附近”搞定

大家好&#xff0c;我是小悟 你们听说了吗&#xff1f;微信又双叒叕出新功能啦&#xff01;这次可不是什么微整形、小游戏之类的小打小闹&#xff0c;而是实实在在的大招——查找附近的工作&#xff01;没错&#xff0c;你没听错&#xff0c;就是那个在你家门口就能找到工作的…...

CANoe与C#联合仿真方案

引言 CANoe作为一款强大的网络仿真工具,能够模拟各种通信协议,尤其是在汽车领域的CAN、LIN、Ethernet等协议。而C#作为一种广泛使用的编程语言,能够为CANoe提供灵活的用户界面和逻辑控制。本文将探讨如何将CANoe与C#结合,实现高效的联合仿真方案。 1. 系统架构 联合仿真…...

公交信息在线查询系统|基于java和小程序的公交信息在线查询系统小程序设计与实现(源码+数据库+文档)

公交信息在线查询系统小程序 目录 基于java和小程序的公交信息在线查询系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂…...

[LeetCode] 1162. 地图分析

题目描述&#xff1a; 你现在手里有一份大小为 n x n 的 网格 grid&#xff0c;上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋&#xff0c;1 代表陆地。 请你找出一个海洋单元格&#xff0c;这个海洋单元格到离它最近的陆地单元格的距离是最大的&#xff0c;并返…...

CentOS 上安装 MySQL(附卸载教程)

在 CentOS 上安装 MySQL 5.7&#xff1a; 1. 添加 MySQL Yum 存储库 首先&#xff0c;确保你已添加 MySQL Yum 存储库。因为你已经安装了 mysql57-community-release-el7-11.noarch&#xff0c;如果需要重新添加&#xff0c;可以使用以下命令&#xff1a; sudo yum localins…...

如何在Matlab界面中添加日期选择器?

在Matlab界面中添加日期选择器&#xff0c;可以让用户通过图形界面方便地选择日期。Matlab提供了uidatepicker函数&#xff0c;允许用户在App Designer设计的GUI中添加日期选择器组件。以下是如何在Matlab界面中添加日期选择器的详细步骤&#xff1a; 1. 使用App Designer添加…...

保险系统的部分模式01

Wolfgang Keller 著&#xff0c;liwenhua 译 摘要 对于许多保险公司来说&#xff0c;要建立一个能够缩短产品周期&#xff0c;柔性灵活的保险系统可谓是一个挑战。虽然这个系统有着巨大的市场&#xff0c;围绕这些相同的问题开展了许多项目&#xff0c;但是这些项目似乎仍然有…...

用你的手机/电脑运行文生图方案

随着ChatGPT和Stable Diffusion的发布&#xff0c;最近一两年&#xff0c;生成式AI已经火爆全球&#xff0c;已然成为移动互联网后一个重要的“风口”。就图片/视频生成领域来说&#xff0c;Stable Diffusion模型发挥着极其重要的作用。由于Stable Diffusion模型参数量是10亿参…...

L1正则化详解

目录 L1 正则化优缺点&#xff1a;适合使用L1正则化的情况&#xff1a;不适合使用L1正则化的情况&#xff1a;参考 L1 正则化 L1正则化是一种常用的正则化技术&#xff0c;也被称为Lasso正则化&#xff08;Least Absolute Shrinkage and Selection Operator&#xff09;。它通…...

C语言在数据库开发中的应用及其代码实践

数据库作为现代软件开发中不可或缺的一部分&#xff0c;其开发和维护工作至关重要。C语言&#xff0c;以其接近硬件的特性和高效率&#xff0c;被广泛应用于数据库系统的核心组件开发中。本文将探讨C语言在数据库开发中的应用&#xff0c;并提供实际的代码示例。 C语言在数据库…...

java maven

参考链接 maven相关配置 maven依赖管理 依赖具有传递性。 maven依赖范围 maven的生命周期 分为三个相互独立的生命周期&#xff1a; 在执行对应生命周期的操作时&#xff0c;需要进行前面的操作。比如&#xff0c;执行打包install的时候&#xff0c;会执行test。...

Java爬虫:获取直播带货数据的实战指南

在当今数字化时代&#xff0c;直播带货已成为电商领域的新热点&#xff0c;通过直播平台展示商品并进行销售&#xff0c;有效促进了产品的曝光和销售量的提升。然而&#xff0c;如何在直播带货过程中进行数据分析和评估效果&#xff0c;成为了摆在商家面前的一个重要问题。本文…...

python 列表、元组、字典易误区

一、删除元素 1、删除列表中的元素 pop del (1)pop(索引) 用于删除指定索引处的元素&#xff0c;并返回被删除的元素的值。默认删除最后一个元素。 eg:list.pop() (2)del 用于删除列表中的指定索引处的元素&#xff0c;或者删除整个列表变量。del操作没有返回值。 eg:del a[1:…...

wireshark或tshark提取tcpdump捕获的数据包(附python脚本自动解析文件后缀)

tcpdump 捕获数据包后&#xff0c;保存的文件通常会被命名为 capture.pcap&#xff08;或其他你指定的名称&#xff09;&#xff0c;并存储在你运行命令的当前目录中。以下是如何使用 tcpdump 进行流量捕获&#xff0c;并找到和使用捕获文件的详细步骤。 1. 使用 tcpdump 捕获…...

了解EasyNVR及EasyNVS,EasyNVR连接EasyNVS显示授权超时如何解决?什么原因?

我们先来了解NVR批量管理软件/平台EasyNVR&#xff0c;它深耕市场多年&#xff0c;为用户提供多种协议&#xff0c;兼容多种厂商设备&#xff0c;包括但不限于支持海康&#xff0c;大华&#xff0c;宇视&#xff0c;萤石&#xff0c;天地伟业&#xff0c;华为设备。 NVR录像机…...

【AUTOSAR标准文档】服务类型介绍

Introduction to types of services The Basic Software can be subdivided into the following types of services: ① Input/Output (I/O) Standardized access to sensors, actuators and ECU onboard peripherals ② Memory Standardized access to internal/external…...

Axure垂直菜单展开与折叠

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure垂直菜单展开与折叠 主要内容&#xff1a;垂直菜单单击实现展开/折叠&#xff0c;点击各菜单项显示选中效果 应用场景&#xff1a;后台菜单设…...

java简单理解哈希算法

这里需要大家有一些哈希表&#xff08;散列表的理论基础&#xff09; 比如冲突怎么处理 key-value是什么意思 有哪些处理冲突的方法 平均查找成功长度和失败长度是什么意思。 详细可以看一下这个数据结构散列表。在java中常用三种结构代表散列&#xff1a; map,set,数组。应在不…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...