面试经典150题——螺旋矩阵

"The harder the conflict, the more glorious the triumph." 

- Thomas Paine

man standing on top of mountain beside cairn stones

1. 题目描述

2.  题目分析与解析

2.1 思路一

看到题目,先仔细观察矩阵,题目要求我们给出顺时针遍历的结果即可,我们根据矩阵可以看出,首先遍历的是向右的行,然后是向下的列,在之后是向左的行,最后是向上的列,以此循环。那么我们按照普通人看见一个这样的矩阵和题目的要求,他会怎么做?那就是尝试按照题目要求的顺序,不断走下去把结果列出即可。

而这个过程人在尝试的遍历的获取结果的时候,是不是还得注意边界的问题,即什么时候需要转弯,什么时候停止(虽然一个人在真正完成任务时可能并没有意识到考虑了这些因素,那只是因为还不够复杂,当更加复杂的矩阵呈现在人面前,人就会尝试找到这两个问题的答案,然后按照其规则移动)?实际上这就是人的一种算法,而计算机想要模拟人的这种解决问题的方式就需要解决人需要解决的问题:

  1. 什么时候需要转弯?

  2. 什么时候停止?

不管怎么样对于一个矩阵A=【n, m】,最先走的肯定是第一行,然后当走到A【0,m - 1】时,就需要转弯了,这时候就是不断变大行也就是从A【1,m - 1】到A【n - 1, m - 1】,然后继续转弯,从A【n - 1, m - 2】到 A【n - 1, 0】,再转弯,从A【n - 2, 0】到A【1,0】,这样就完成了第一次循环。

可以发现,转弯的条件就是:

  • 当遍历行时,当列到达边界就需要转弯

  • 当遍历列时,当行达到边界就需要转弯

  • 同时需要注意,在每遍历完一行或者一列时,边界也是需要不断收缩的

现在再回过头再看看:(边界是【0,0】【n - 1,m - 1】表示左上角和右下角的元素下标)

  • 开始的边界是【0,0】【n - 1,m - 1】,最先走的肯定是第一行,然后当走到A【0,m - 1】时,就需要转弯了,此时需要收缩边界变为【1,0】【n - 1,m - 1】

  • 开始的边界是【1,0】【n - 1,m - 1】,不断变大行也就是从A【1,m - 1】到A【n - 1, m - 1】,然后继续转弯,此时需要收缩边界变为【1,0】【n - 1, m - 2】

  • 开始的边界是【1,0】【n - 1,m - 2】,不断变小列也就是从A【n - 1, m - 2】到A【n - 1, 0】,然后继续转弯,此时需要收缩边界变为【1,0】【n - 2, m - 2】

  • 开始的边界是【1,0】【n - 2, m - 2】,不断变大行也就是从A【n - 2,0】到A【1, 0】,然后继续转弯,此时需要收缩边界变为【1,1】【n - 2, m - 2】

可以看出,当遍历行时,到达终点需要收缩行,当遍历列时,达到终点需要收缩列。

所以我们是不是就可以这样一层一层的遍历,直到边界收缩到一个元素,也就是左上角边界等于右下角边界停止?

代码思路:

  1. 初始化边界,【0,0】和【行数 - 1,列数 - 1】

  2. while循环,停止条件为边界相等

  3. 走每一个边,走完一个边需要收缩边界并且转弯,并且在走该边之前要先判断是否以及越界

3. 代码实现

4. 相关复杂度分析

时间复杂度分析

  • 总的时间复杂度为 O(m*n),其中 m 和 n 分别是输入矩阵的行数和列数。矩阵中的每个元素都要被访问一次。

空间复杂度分析

  • 额外空间:除了存储结果的列表外,代码没有使用额外的数据结构,除了输出数组以外,空间复杂度是常数O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/393201.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源软件:推动软件行业繁荣的力量

文章目录 📑引言开源软件的优势分析开放性与透明度低成本与灵活性创新与协作 开源软件对软件行业的影响推动技术创新和进步促进软件行业的合作与交流培养人才和提高技能促进软件行业的可持续发展 结语 📑引言 随着信息技术的飞速发展,软件已经…

Java Remote Debug(远程调试)

【华邦云使用过】&#xff1a; -agentlib:jdwptransportdt_socket,address9090,servery,suspendn SpringBoot远程Debug步骤 配置Maven 首先在Maven的pom.xml中配置好如下信息&#xff1a; <project> ... <build> ... <plugins> ... <plugin> &…

机器学习 | 实现图像加密解密与数字水印处理

目录 实现窗口可视化 数字图像加密 窗口布局设置 基于混沌Logistic的图像加密 基于三重DES的图像加密 数字图像解密 窗口布局设置 基于混沌Logistic的图像解密 基于三重DES的图像解密 基于LSB的数字水印提取 窗口布局设置 水印的嵌入与提取 实现窗口可视化 这里…

【力扣 - 环形链表】

题目描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

Chrome浏览器安装Axure-Chrome-Extension插件

Chrome浏览器打开Axure生成的HTML静态文件页面时&#xff0c;会显示如下图AXURE RP EXTENSION FOR CHROME&#xff0c;这是因为Chrome浏览器没有安装Axure插件Axure-Chrome-Extension导致的。 解决方法&#xff1a; 插件下载地址&#xff1a;https://download.csdn.net/downlo…

传日本软银CEO拟筹资成立AI芯片公司 | 百能云芯

据美国财经媒体报道&#xff0c;日本软体银行集团执行长孙正义计划筹资1,000亿美元&#xff0c;以成立一家人工智能&#xff08;AI&#xff09;芯片公司&#xff0c;这一举措旨在与英伟达&#xff08;Nvidia&#xff09;等现有市场领导者竞争。 计划的核心目标是通过新公司供应…

C语言系列-预定义符号#define定义宏#define定义宏

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 目录 预定义符号 #define定义常量 #define定义宏 预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ /…

SG7050VAN晶体振荡器规格书

SG7050VAN 晶振是EPSON/爱普生的一款额定频率73.5 MHz to 700 MHz的石英晶体振荡器&#xff0c;4脚贴片&#xff0c;7050封装常规有源晶振&#xff0c;具有小尺寸&#xff0c;高稳定性。该款有源晶体振荡器&#xff0c;可以在B : -20 C to 70 C / G : -40 C to 85 C C的温度内稳…

在UE5中使用体积材质

在平时使用UE的材质设置时&#xff0c;经常会看见Material Domain Volume类型&#xff0c;但是却很少使用。其实该类型可以配合体积雾使用&#xff0c;并制作体积效果以弥补自带雾参数的不足。 操作流程 首先找到场景中的ExponentialHeightFog组件&#xff0c;开启体积雾Volu…

基于Spring Boot的知识管理系统,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1759142297630486530

龙年新目标!龙蜥安全联盟第三次月会圆满结束

2024 年 2 月 1 日&#xff0c;龙蜥社区安全联盟&#xff08;OASA&#xff0c;以下简称“联盟”&#xff09;月度会议召开&#xff0c;线上线下共计 33 位代表参会&#xff0c;由秘书处成员齐增田主持本次会议。本次会议主要内容包括 2023 联盟回顾、2024 年的目标和规划、联盟…

激光跟踪仪|6D跟踪仪测量大尺寸空间姿态

标题理解激光跟踪仪的工作原理与应用 激光跟踪仪基于激光干涉和测距原理&#xff0c;通过发射和接收激光束来实现对目标物体的跟踪和测量。它是将激光照射到接触测量目标物的目标&#xff08;使用反射器等&#xff09;上&#xff0c;然后经目标反射的激光返回发光源&#xff0…

[计算机网络]---Http协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习&#xf…

pve系统下从0到1搭建好用的OpenWRT系统

从0到1搭建好用的OpenWRT系统 通过PVE虚拟平台搭建OpenWRT系统在PVE上创建OpenWRT虚拟机下载OpenWRT镜像文件上传镜像到PVE创建虚拟机安装OpenWRT系统修改OpenWRT的ip地址&#xff0c;使得OpenWRT可以被前端访问配置OpenWRT的网关和dns&#xff0c;使系统可以访问外网 修改为国…

【JavaSE】类和对象

面向对象概述 面向对象编程&#xff08;简称POP&#xff09;&#xff0c;其核心思想就是参照现实中的事物&#xff0c;将事物的属性特征、行为特征抽象出来&#xff0c;使用类来表示&#xff0c;当涉及到一个具体的实例时&#xff0c;就将类进行实例化&#xff0c;使用一个对象…

数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索

UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程。以下是我之前写的一个自动化测试的小Demo。这个Demo基于Selenium与Java。由于现在Selenium在自动化测试的统治地位&#xff0c;并且随着Selenium 4的即将发布&#xff0c;在未来很长的一段时间里…

探索设计模式的魅力:掌握命令模式-解锁软件设计的‘遥控器’

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;并且坚持默默的做事。 引言&#xff1a;探索命令模式的奥秘 软件设计领域充满挑战与机遇&#xff0c;命令模式…

Android下SF合成流程重学习之Refresh流程

Android下SF合成流程重学习之Refresh流程 引言 在前面初步分析完成了Android下SF合成流程重学习之Invalidate流程&#xff0c;我们接下来继续下面的分析。当有事务的更新或者有Buffer的更新便会触发后面刷新的流程,即Refresh流程&#xff01; 一. onMessageRefresh 文件&…

Vue24 收集表单数据 实例

实例 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>收集表单数据</title><script type"text/javascript" src"../js/vue.js"></script></head><body><!-- 收集…

线性回归-使用ClickHouse机器学习函数

本文字数&#xff1a;5923&#xff1b;估计阅读时间&#xff1a;15 分钟 作者&#xff1a;Ensemble 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 这原本是转发的ensemble analytics的文章。 【https://ensembleanalytics.io/blog/l…