面试经典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)。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32 CubeMX】SPI层次结构SPI协议与SPI控制器结构

文章目录 前言一、SPI 程序层次1.1 硬件原理图1.2 硬件框图1.3 软件层次 二、SPI协议2.1 硬件连线2.2 如何访问SPI设备2.3 SPI 框图 总结 前言 随着嵌入式系统的迅猛发展,STM32系列微控制器在各种应用中得到广泛应用。在嵌入式系统设计中,串行外设接口&…

Vue练习1:组件开发1(头像组件)

样式预览 注释代码 <template><div class"img-box":style"{ //动态style必须为对象width: size rem,height: size rem}"><imgclass"avatar-img":src"url" //动态url/></div> </templ…

MATLAB环境下使用二维高分辨时频分析方法提取波状分量

MATLAB环境下使用二维高分辨时频分析方法提取波状分量&#xff08;分离混合地震数据&#xff09;。 为了得到更高的时频分辨率&#xff0c;近年来涌现出了大量的新的时频分析方法。有些以线性和非线性时频分析为基础&#xff0c;有些则另辟蹊径&#xff0c;比如Hilbert-Huang变…

由斐波那契数列探究递推与递归

斐波那契数列定义&#xff1a; 斐波那契数列大家都非常熟悉。它的定义是&#xff1a; 对于给定的整数 x &#xff0c;我们希望求出&#xff1a; f ( 1 ) f ( 2 ) … f ( x ) f(1)f(2)…f(x) f(1)f(2)…f(x) 的值。 有两种方法,分别是递推(迭代)与递归 具体解释如下图 备注…

C++入门学习(二十九)goto语句

在C中&#xff0c;goto语句是一种控制流语句&#xff0c;用于无条件地转移到程序中指定的行。goto语句的使用通常是不推荐的&#xff0c;因为它可能导致代码结构变得混乱、不易理解和维护。然而&#xff0c;在某些特殊情况下&#xff0c;goto语句可能是一种有效的解决方法。 示…

vue-vuex(七)

阅读文章你可以收获&#xff1a; 1 了解什么是vuex 2 知道如何在vue项目中集成vuex 3 知道vuex由什么组成&#xff0c;并如何使用 vuex概述 1. 是什么&#xff1a;vuex 是一个 vue 的 状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;vuex 是一个插件&#xff0…

初识最短路径

一.最短路径的介绍 最短路径是图论和网络分析中一个重要的概念&#xff0c;它指的是在一个图或网络中连接两个节点或顶点的路径中&#xff0c;具有最小权重总和的路径。这个权重可以表示为路径上边或弧的长度、耗费、时间等&#xff0c;具体取决于问题的背景和应用场景。 如果你…

PHP服务商微信支付分支付(需确认模式)

//查询支付分是否支付 public function serviceorderServiceorder($out_order_no) {$setting [];$service_id $setting[service_id];$sub_mchid $setting[mchid];$ps "/v3/payscore/partner/serviceorder?service_id${service_id}&sub_mchid${sub_mchid}&out…

【自然语言处理】实验3,文本情感分析

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢…

Java 学习和实践笔记(12)

这个就比较有意思了&#xff01;所有的事情&#xff0c;拆分完之后&#xff0c;都有且只有这三种状态流程&#xff01; //TIP To <b>Run</b> code, press <shortcut actionId"Run"/> or // click the <icon src"AllIcons.Actions.Execute&…

LGAMEFI基于BPL公链开发的第一生态:开启RWA游戏娱乐与DeFi融合的新纪元

在去中心化金融&#xff08;DeFi&#xff09;与游戏娱乐的结合趋势中&#xff0c;BPL公链上的LGAMEFI项目代表了前沿的技术革新和市场领导。这种将web2上成熟页游进行RWA链改&#xff0c;不仅仅是将游戏热门领域融合&#xff0c;更是在寻找一种全新的参与者经验&#xff0c;将玩…

archLinux安装记录

archLinux安装记录 基于wsl的arch 启用wsl 首先&#xff0c;按Win S搜索启用或关闭Windows功能&#xff08;Turn Windows features on or off&#xff09;,打开虚拟机平台和WSL&#xff0c;并重启Windows。 重启后&#xff0c;进入Windows设置&#xff0c;检查更新。 更新完…