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

news2025/3/13 3:11:29

"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)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

漏桶和令牌桶有啥区别?

漏桶算法 漏桶算法是一种流量控制算法,可以平滑控制流量的进出,原理比较简单:假设我们有一个水桶按固定的速率向下方滴落一滴水,无论有多少请求,请求的速率有多大,都按照固定的速率流出,对应到系统中就是按…

RK3399平台开发系列讲解(USB篇)USB 主设备和从设备

🚀返回专栏总目录 文章目录 一、主设备二、集线器三、功能设备 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍 USB 主设备和从设备。 一、主设备 检测 USB 设备的插拔动作管理主从通讯之间的控制流管理主从通…

如何使用python 挑战将ai生成的概念图制作成2d游戏

要使用Python将AI生成的概念图制作成2D游戏,你可以遵循以下步骤: 生成概念图: 使用AI图像生成工具(如DALL-E、DeepArt等)来创建你的游戏概念图。保存生成的图像文件,通常为PNG或JPEG格式。 选择游戏引擎&a…

SHERlocked93 的 2021 年终总结

我还是和往年一样,总结发的又晚了一点,为什么又发这么晚呢,因为懒 年终总结 疫情之后时间时间过的太快了,不知道是不是只有我这样感觉。 四五月份去兰州玩了下(其实是出差),终于看到了黄土高原&…

力扣 123. 买卖股票的最佳时机 III

题目来源:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/ C题解:动态规划。至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。 一天一共就有四个状态: 第…

ubuntu22.04@laptop OpenCV Get Started: 013_contour_detection

ubuntu22.04laptop OpenCV Get Started: 013_contour_detection 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. contour_approx应用3.1 读取图像并将其转换为灰度格式3.2 应用二进制阈值过滤算法3.3 查找对象轮廓3.4 绘制对象轮廓3.5 效果3.6 CHAIN_APPROX_SIMPLE v.s…

在Linux系统中安装LANMP

LANMP是Linux下Apache、Nginx、MySQL和PHP的应用环境,本节演示 的是WDLinux的一款集成的安装包,操作起来非常简单。首先,下载需要的安装包, 命令如下所示。 wget http://dl.wdlinux.cn/files/lanmp_v3.tar.gz 下载完成后进行解压…

Eclipse - Reset Perspective

Eclipse - Reset Perspective 1. Window -> Perspective -> Reset Perspective2. Reset Perspective -> YesReferences 1. Window -> Perspective -> Reset Perspective 2. Reset Perspective -> Yes ​​​ References [1] Yongqiang Cheng, https://yo…

Rocky Linux网卡静态配置

一、Rocky Linux 下载安装 1、安装教程 Rocky Linux 下载安装 二、远程工具MobaXterm下载安装 1、安装教程 (预留) 三、Rocky Linux 网卡配置 1、使用ip addr确认网卡名称(此处可得知网卡为ens160) [rootlocalhost ~]# ip a 1:…

[Angular 基础] - 视图封装 局部引用 父子组件中内容传递

[Angular 基础] - 视图封装 & 局部引用 & 父子组件中内容传递 之前的笔记: [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上为静态页面,即不涉及到跨组…

每日五道java面试题之java基础篇(十一)

目录: 第一题. Java死锁如何避免?第二题. 为什么⽤线程池?解释下线程池参数?第三题. 线程池的底层⼯作原理第四题. ReentrantLock中tryLock()和lock()⽅法的区别第五题. Sychronized和ReentrantLock的区别? 第一题. Java死锁如何避免&#x…

元器件焊盘的PCB处理方式分析与总结

对于高速信号走线的特性阻抗,都需要按照实际要求进行精度控制,所以,任何因设计因素带来的阻抗波动都应该进行优化,如下图所示,为一个12层板设计中的50Ω微带走线,需要在走线之上放置电感; 但是&…

Open CASCADE学习|管道建模

​这是用Open CASCADE Technology (OCCT)库来创建一个管道模型的示例。OCCT是一个开源的几何建模库,广泛应用于CAD/CAM/CAE和其他几何建模应用中。 在下面的代码中,首先创建了一些点,并用这些点来构建B样条曲线,进而创建边(Edges…

openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优

文章目录 openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优222.1 前提条件222.2 内存相关参数设置222.3 网络相关参数设置222.4 I/O相关参数设置 openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优 在性能调优过程中,可以根据…

面试题-01

1、JDK 和 JRE 和 JVM 分别是什么,有什么区别? JDK(Java Development Kit,Java 软件开发工具包) JDK(Java Development Kit):JDK 是 Java 开发⼯具包,包含了编写、编译…

政安晨:【完全零基础】认知人工智能(一)【超级简单】的【机器学习神经网络】 —— 预测机

开个头 很多小伙伴们很想亲近人工智能与机器学习领域,然而这个领域里的核心理论、算法、工具给人感觉都太过“高冷”,让很多小伙伴们望而却步,导致一直无法入门。 如何捅破这层窗户纸? 让高冷的不再高冷,让神秘的不…

jwt+redis实现登录认证

项目环境&#xff1a;spring boot项目 pom.xml引入jwt和redis <!-- jwt --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.3.0</version></dependency><!-- redis坐标-->…

使用redis-insight连接到服务器上的redis数据库

一、安装redis&#xff1a; 安装 Redis。你可以通过运行下面的命令来使用 yum 安装 Redis&#xff1a; sudo yum install redis 启动 Redis 服务。安装完成后&#xff0c;你可以通过运行下面的命令来启动 Redis 服务&#xff1a; sudo systemctl start redis 设置 Redis 服务…

Eclipse - 查看工程或者文件的磁盘路径

Eclipse - 查看工程或者文件的磁盘路径 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explorer 4.1.0 -> Install2. right-click -> Open in ExplorerReferences 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explo…

数据结构-邻接矩阵

介绍 邻接矩阵&#xff0c;是表示图的一种常见方式&#xff0c;具体表现为一个记录了各顶点连接情况的呈正方形的矩阵。 假设一共有以下顶点&#xff0c;其连接关系如图所示 那么&#xff0c;怎么表示它们之间的连接关系呢&#xff1f; 我们发现&#xff0c;各条边所连接的都…