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

LeetCode 算法:螺旋矩阵c++

原题链接🔗:螺旋矩阵
难度:中等⭐️⭐️

题目

给你一个 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] <= 1

题解

四指针遍历法

  1. 题解

这个算法不需要修改原始矩阵。以下是实现这个算法的步骤:

  1. 初始化四个边界:top 表示矩阵的顶部边界,bottom 表示底部边界,left 表示左侧边界,right 表示右侧边界。
  2. 创建一个空列表 result 用于存储按螺旋顺序排列的元素。
  3. 使用一个循环,直到 top 大于 bottomleft 大于 right
    • leftright 遍历 top 行,将这些元素添加到 result
    • 增加 top 的值,缩小顶部边界。
    • topbottom 遍历 right 列,将这些元素添加到 result
    • 减少 right 的值,缩小右侧边界。
    • 如果 top 小于等于 bottom,从 rightleft 遍历 bottom 行,将这些元素添加到 result
    • 减少 bottom 的值,缩小底部边界。
    • 如果 left 小于等于 right,从 bottomtop 遍历 left 列,将这些元素添加到 result
    • 增加 left 的值,缩小左侧边界。
  4. 返回 result 列表,它包含了矩阵中所有元素的顺时针螺旋顺序。
  1. 复杂度:时间复杂度O(m×n),因为每个单元格都被填充一次;空间复杂度O(m×n),用于存储最终的矩阵。
  2. 过程

螺旋矩阵是一种特殊的矩阵,其元素按照螺旋的方式填充,从外圈向内圈逐渐填充,每个元素的值依次递增。

实现过程如下:

  1. 首先,函数检查输入矩阵是否为空或其子数组是否为空。如果是,则直接返回一个空的一维数组。

  2. 定义四个变量top, bottom, left, right来分别表示矩阵的上边界、下边界、左边界和右边界。

  3. 使用一个while循环,当top不大于bottomleft不大于right时,循环继续。这确保了矩阵中至少还有一行或一列可以遍历。

  4. 在循环内部,首先从leftright遍历矩阵的顶部行,将这些元素添加到结果数组中,然后top加1。

  5. 接着,从topbottom遍历矩阵的最右列,将这些元素添加到结果数组中,然后right减1。

  6. 确保在继续之前,当前的遍历行与上一次的遍历行不同(如果top小于等于bottom),从rightleft遍历矩阵的底部行,然后bottom减1。

  7. 同样,确保在继续之前,当前的遍历列与上一次的遍历列不同(如果left小于等于right),从bottomtop遍历矩阵的最左列,然后left加1。

  8. 函数最后返回包含矩阵所有元素的一维数组,这些元素按照螺旋顺序排列。

main函数中创建了3x3、3x4的两个矩阵,并调用spiralOrder函数来获取螺旋顺序的元素,然后打印这些元素。

  1. c++ demo
#include <iostream>
#include <vector>std::vector<int> spiralOrder(const std::vector<std::vector<int>>& matrix) {if (matrix.empty() || matrix[0].empty()) return {};std::vector<int> result;int top = 0, bottom = matrix.size() - 1;int left = 0, right = matrix[0].size() - 1;while (top <= bottom && left <= right) {// Traverse from left to right.for (int i = left; i <= right; ++i) {result.push_back(matrix[top][i]);}++top;// Traverse downwards.for (int i = top; i <= bottom; ++i) {result.push_back(matrix[i][right]);}--right;// Make sure we are now on a different row.if (top <= bottom) {for (int i = right; i >= left; --i) {result.push_back(matrix[bottom][i]);}--bottom;}// Make sure we are now on a different column.if (left <= right) {for (int i = bottom; i >= top; --i) {result.push_back(matrix[i][left]);}++left;}}return result;
}int main() {std::vector<std::vector<int>> matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};std::vector<int> spiral = spiralOrder(matrix);for (int num : spiral) {std::cout << num << " ";}std::cout << std::endl;std::vector<std::vector<int>> matrix2 = {{1, 2,  3,  4 },{5, 6,  7,  8 },{9, 10, 11, 12}};std::vector<int> spiral2 = spiralOrder(matrix2);for (int num : spiral2) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
  • 输出结果:

1 2 3 6 9 8 7 4 5
1 2 3 4 8 12 11 10 9 5 6 7
在这里插入图片描述

相关文章:

LeetCode 算法:螺旋矩阵c++

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

【全开源】医护上门系统小程序APP公众号h5源码

医护上门系统&#xff1a;健康守护&#xff0c;就在您身边 &#x1f6aa;引言&#xff1a;开启全新的医护模式 在快节奏的现代生活中&#xff0c;健康问题往往成为我们关注的焦点。而“医护上门系统”正是为了满足这一需求&#xff0c;将专业的医疗服务送到您的家中。这一创新…...

结构体<C语言>

导言 结构体是C语言中的一种自定义类型&#xff0c;它的值&#xff08;成员变量&#xff09;可以是多个&#xff0c;且这些值可以为不同类型&#xff0c;这也是和数组的主要区别&#xff0c;下面将介绍它的一些基本用法&#xff0c;包括&#xff1a;结构体的创建、结构体变量的…...

点云分割报告整理(未完成版-每天写一点)

体积占用网格表示对点进行体素化&#xff0c;然后使用3d卷积神经网络来学习体素级语义。由于点云的稀疏性&#xff0c;体素化效率低&#xff0c;为避免较高的计算成本而忽略了细节。此外&#xff0c;由于同一体素内的所有点都被赋予了相同的语义标签&#xff0c;因此精度受到限…...

python基础 002 - 1 基础语法

1 标识符&#xff08;identifier&#xff09;&#xff0c;识别码&#xff0c;表明身份 身份证&#xff0c;ID 定义&#xff1a;在编程语言中标识符就是程序员自己规定的具有特定含义的词&#xff0c;比如类名称、属性名称、变量名等&#xff0c; 在Python 中&#xff0c;pyt…...

浅谈Web开发的三大主流框架:Angular、React和Vue.js

在现代Web开发领域&#xff0c;Angular、React和Vue.js作为三大主流前端框架&#xff0c;各自拥有独特的特点和优势&#xff0c;为开发者提供丰富的选择。让我们更深入地了解这三大框架&#xff0c;并通过一些小型样例来展示它们的特性。 Angular Angular是一个完整的前端框架…...

使用net.sf.mpxj读取project的.mpp文件

1、导入.mpp文件 public void importMppFile(String updateType, MultipartFile multipartFile) {try (InputStream inputStream multipartFile.getInputStream()) {// 读取文件的组件MPPReader mppReader new MPPReader();// 注意&#xff0c;如果在这一步出现了读取异常&a…...

ubuntu 22.04 升级到24.04

step1. sudo apt update sudo apt upgrade sudo apt dist-upgrade step2. sudo apt autoremove step3. sudo apt install update-manager-core step4. sudo vim /etc/update-manager/release-upgrades 将 Prompt 设置为 lts&#xff1a; Promptlts 保存并退出 step5. sudo do-r…...

FreeRTOS学习笔记-基于stm32(14)内存管理

一、FreeRTOS 内存管理简介 FreeRTOS有两种方法来创建任务&#xff0c;队列&#xff0c;信号量等&#xff0c;一种动态一种静态。静态方法需要手动定义任务堆栈。使用动态内存管理的时候 FreeRTOS 内核在创建任务、队列、信号量的时候会动态的申请 RAM。 我们在移植FreeRTOS时可…...

关于Lambert W函数

来源&#xff1a;R. M. Corless, G. H. Gonnet, D. E. G. Hare, D. J. Jeffrey, and D. E. Knuth, “On Lambert’s W function,” Adv. Comput. Math., vol. 5, pp. 329–359, May 1996, doi: 10.1007/BF02124750. 摘要 Lambert W函数被定义为函数 w ↦ w e w w \mapsto we^…...

【免杀】C2远控-APC注入-进程镂空

目录 进程镂空&傀儡进程&#xff08;主要过内存扫描&#xff09;代码 傀儡进程演示如何上线上线演示 APC注入&进程欺骗&#xff08;主要过内存扫描&#xff09;同步调用与异步调用代码演示 进程镂空&傀儡进程&#xff08;主要过内存扫描&#xff09; 进程镂空(Pro…...

20240611 讯飞JAVA工程师(研发经理岗)面试

1.线程安全的集合类 在Java中&#xff0c;一些线程安全的集合类有Stack、Vector、Properties、Hashtable等 2.线程池中execute和submit的区别 1&#xff09;参数及返回值不同 excute只能提交Runnable&#xff0c;无返回值 submit既可以提交Runnable&#xff0c;返回值为null&am…...

【研发日记】Matlab/Simulink软件优化(三)——利用NaNFlag为数据处理算法降阶

文章目录 前言 背景介绍 初始算法 优化算法 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 见《【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法》 背景介绍 在一个嵌入式软件开发项目中&#xff0c;需要开…...

go语言接口之http.Handler接口

package httptype Handler interface {ServeHTTP(w ResponseWriter, r *Request) }func ListenAndServe(address string, h Handler) error ListenAndServe函数需要一个例如“localhost:8000”的服务器地址&#xff0c;和一个所有请求都可以分 派的Handler接口实例。它会一直运…...

R语言 | 使用最简单方法添加显著性ggpubr包

本期教程原文&#xff1a;使用最简单方法添加显著性ggsignif包 本期教程 获得本期教程代码和数据&#xff0c;在后台回复关键词&#xff1a;20240605 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组下游…...

【Linux】shell脚本变量——系统变量、环境变量和用户自定义变量

系统变量 系统变量是由系统预设的&#xff0c;它们通常在系统启动时被加载&#xff0c;并对所有用户和所有shell实例都有效。这些变量通常控制着系统的行为和配置&#xff0c;例如PATH&#xff08;命令搜索路径&#xff09;、HOME&#xff08;用户主目录&#xff09;等。系统变…...

QWidget 属性——windowTitle·windowIcon·qrc

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、windowTitle二、windowIcon三、qrc 一、windowTitle windowTitle 是一个通常用于表示窗口标题…...

深入理解rtmp(一)之开发环境搭建

深入理解rtmp(一)之开发环境搭建 手机直播在15年的时候突然火起来,随着花椒,映客等出现,直播一下就出现在了风口,各个公司针对直播的战斗迅速打响,战斗过程比较短暂,随着许多公司的退出和死去,手机直播行业趋于稳定,直播服务时长也被传统的CDN厂商牢牢占据,后面大家又把精力投…...

java常用面试基础题

&与&&区别&#xff1f; &和&&都是逻辑运算符&#xff0c;都是判断两边同时真则为真&#xff0c;否则为假&#xff1b;但是&&当第一个条件不成之后&#xff0c;后面的条件都不执行了&#xff0c;而&则还是继续执行&#xff0c;直到整个条件…...

互联网摸鱼日报(2024-06-11)

互联网摸鱼日报(2024-06-11) 36氪新闻 雅诗兰黛&#xff0c;胆子也太大了 苹果WWDC终极前瞻&#xff1a;5大看点20大AI新功能&#xff0c;库克不能输的一战 瑞士清洁科技公司Enerdrape开发预制地热板&#xff0c;回收城市地下空间的浅层地热能和废热用于建筑物制热或制冷 | …...

中介子方程十二

X$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XdX$XpX$XdX$XyXeXαX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XVXpX$XyXtXkXrXiXα…...

SLT简介【简单介绍SLT】

SLT简介 在c的学习当中STL的学习是一个很重要的一环&#xff0c;但是STL又是一个庞大的章节&#xff0c;因此这里我们先简单介绍一下STL&#xff0c;有助于后面我们对STL的学习&#xff0c;这里就是做一个简单的介绍&#xff0c;并无干货。 1.什么是STL STL(standard templa…...

vue实现pdf下载——html2canvas

html2canvas 官方文档https://html2canvas.hertzen.com/getting-started html2canvas 的原理是通过遍历DOM树,将每一个HTML元素转化为Canvas对象,并叠加到一起形成一张完整的图片或者PDF文件。 1. 安装插件 npm install html2canvas jspdf --save 2.使用&#xff08;页面已经…...

安装docker+mysql的一些坑

yum -y install docker 提示missing signature 参考这里 https://www.8a.hk/news/content/8235.html 卸载旧的docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装…...

React Native采集数据离线存储、网络状态监控、加密上传、鉴权

在无网络环境下进行数据采集并在有网络时上传至服务器&#xff0c;同时确保数据的鉴权和加密&#xff0c;这一需求需要考虑多方面的实现细节。无论您选择原生开发还是使用React Native&#xff08;甚至Expo&#xff09;&#xff0c;以下是如何实现这一需求的具体步骤和建议。 …...

网络数据库后端相关面试题(其三)

18&#xff0c; 传输控制协议tcp和用户数据报协议udp有哪些区别 第一&#xff0c;tcp是面向字节流的&#xff0c;基本的传输单位是tcp报文段&#xff1b;而udp是面向报文的&#xff0c;基本传输单位是用户数据报。 第二&#xff0c; tcp注重安全可靠性&#xff0c;连接双方在…...

Hadoop之HDFS分布式文件系统

HDFS简介 Hadoop Distributed File System (HDFS): HDFS 是 Hadoop 的分布式文件系统,它设计用于存储大量数据,并提供 高吞吐率的数据访问,通过将数据分块存储在多个节点上,实现数据的冗余存储和容错。 HDFS重要概念 HDFS 通过统一的命名空间目录树来定位文件; 另外,它…...

插入删除单链表指定结点-偷天换日法

王道说下面的代码有BUG&#xff0c;比如当删除的结点p在最后一个元素时&#xff0c;p->nextNULL; So *q NULL; q->data就是错误的&#xff0c;我认为加个判断就行 加个判断即可 /*看着是删除q了&#xff0c;从结果上看就是把p删除了 偷天换日法*/ bool DeleteNode(LNod…...

MybatisPlus代码生成器使用案例

针对数据库中的实体类表&#xff0c;自动生成相关的pojo类&#xff0c;mapper&#xff0c;service等 1. Get-Started 基于mybatisplus&#xff0c;idea下载mybatisplus插件 sql文件 /*!40101 SET OLD_CHARACTER_SET_CLIENTCHARACTER_SET_CLIENT */; /*!40101 SET NAMES utf8 …...

数学公式编辑器(前端预研)

数学公式输入wangeditor&#xff1a; vue2使用wangeditor实现数学公式和富文本编辑器 mathjax文档&#xff1a;MathJax: 让前端支持数学公式 mathjax识别数学公式vue中使用mathjax识别latex数学公式 数学公式编辑器&#xff1a;&#xff08;少&#xff09; https://github.com…...

石家庄网站运营公司/旺道营销软件

这个就是我上个博客的函数再用下就行了&#xff0c;我直接上题了。 #include<stdio.h> #include<stdlib.h>typedef struct BinTreeNode {int data;struct BinTreeNode *Lchild;struct BinTreeNode *Rchild; }BinTreeNode,*BinTree;void CreateTree(BinTreeNode …...

一级a做爰片就在线看网站/uc浏览网页版进入

1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1783 Solved: 753[Submit][Status][Discuss]Description FJ打算带他的N(1 < N < 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”。在这场比赛中&#xff0c;每个参赛者都必须让他的奶…...

怎样做视频直播网站/电商怎么注册开店

今天遇到了一个问题&#xff0c;查询一条数据&#xff0c;返回用list接&#xff0c;发现少了2个值&#xff08;ssh框架&#xff09;。执行SQL少的这两个字段的值为null。上图说明一下&#xff1a; 可以看到第一次查询没有角标38、39的值。 是同一条SQL&#xff0c;第一张图数据…...

关键词搜索数据/北京seo招聘

String类型支持长度可变的字符串&#xff0c;需要包含头文件#include<string> 1、string对象的定义和初始化 string支持好几种初始化方式&#xff1a; 初始化方式 说明 String s1; 默认构造函数&#xff0c;s1是空串 String s2(s1) 将s2初始化为s1的一个副本 String s3(“…...

建材家居网站模板/推广普通话的意义论文

springmvc 替换之前的servlet&#xff0c;用注解型标记进行操作的servlet类&#xff08;就是之前servlet类上面的Webservlet注解中参数&#xff1a;当前类的访问路径名&#xff09;&#xff0c;然后响应也用注解&#xff0c;据体如下&#xff1a; 先创建web项目 再导入需要的包…...

什么是网站建设流程/市场调研公司排名

基于现有数据库生成POCO数据类和数据库上下文需要借助Visual Studio一个扩展插件-- Entity Framework Power Tools&#xff08;一个Code First反向工程工具&#xff09;。只要在Visual Studio扩展里面输入“Entity Framework Power”搜索即可找到最新的扩展&#xff0c;点击下载…...