LeetCode54 螺旋矩阵,题目不重要,重要的是这个技巧

本文介绍LeetCode第54题——Spiral Matrix的解题思路,重点在于利用方向数组解决螺旋遍历的问题。文章通过分析题意,提出方向数组的概念,阐述如何通过维护方向和边界判断实现螺旋遍历,降低代码复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文始发于个人公众号:TechFlow,原创不易,求个关注


今天是LeetCode专题的第32篇文章,我们一起看的是LeetCode的第54题——Spiral Matrix。

首先解释一下题意,这个Spiral是螺旋的意思,据说英文版的漫画里,把鸣人的螺旋丸就翻译成Spiral Sphere…

走远了,回归正传。通过螺旋丸我们都知道螺旋形是什么意思,所以所谓的螺旋矩阵,就是按照螺旋形的顺序来遍历一个数组,或者说矩阵。我们可以看下下图:

箭头标注的顺序就是螺旋的顺序,这道题让我们求的就是按照螺旋的顺序遍历之后的结果。

背景

这道题的题意非常简单,我想大家肯定都能看明白,但是真的要上手去做会发现还是蛮困难的。主要的难点就是我们遍历的顺序一直在变化,并且变化的速度也是在变化的。虽然从某种程度上来说,这些变化都是有迹可循的,但是即便如此,把这些规律抽象出来写成简单易懂没有bug的代码也并不是一件容易的事情。

如果我没有记错的话,当年我大二的时候学校里的acm校赛有一题就是这个,一模一样的原题。虽然非常简单,每个人都知道怎么做,但是最后的通过率并不高。

这并不完全是出题人的恶意,其实这类问题在acm的比赛当中还是很常见的。经常会有一些题目很清晰明确,你只需要照着实现就可以了的题目。考察的就是选手的抽象和编码能力,虽然题意不难,但是在比赛高压的场景下想要快速写出一个几百行包含一系列复杂逻辑的程序并且没有bug,还是非常困难的一件事。由于这类题目的关键就是让我们模拟出来题目的意思,所以也被称为模拟题。

想要比较顺手地写出这道题,需要一个很常用的技巧或者说惯例,这也是这篇文章的关键。

方向数组

在许多问题当中我们经常会遇到这样一个问题,比如我们需要遍历一个迷宫,需要沿着现实世界当中上下左右或者是东南西北的方向进行移动。在移动的过程当中自然就涉及各种各样的方向,于是我们需要用代码来表示方向。

比如我们画一个小人,它所在的坐标是(x, y),它有东南西北四个方向可以选。我们假设他每次移动一个单位的距离,我们很容易就得出它往各个方向移动之后的新坐标。

根据数学上向量的定义,我们可以写出这四个方向的方向单位向量:[0, 1], [0, -1], [1, 0], [-1, 0]。

我们把这些向量存放进一个常量数组当中,就得到了方向数组。当我们需要遍历所有方向的时候,我们只需要遍历这个数组即可。

不仅如此,如果我们对方向的遍历顺序有要求,它也完全可以实现。比如在这题当中,我们可以发现,螺旋遍历每一次改变顺序其实都是向左转了90度

原本朝东的旋转之后变成了朝南,朝南的变成了朝西,朝西的成了朝北,而朝北的成了朝东。那么我们只需要把方向按照东南西北的顺序摆放,我们每次把方向数组的下标增加一位并对4取模,就得到了下一个方向。

这个技巧并不难理解,但是可以大大简化我们的代码。

解答

理解了方向数组之后剩下的就容易多了,我们观察一下上面螺旋遍历的过程,每一次改变方向遍历的长度虽然不同,但是每一次改变的原因是一致的,就是这个方向上已经遍历到头了,所以我们需要变更方向。明白了这点其实就很容易了,我们只需要维护每个方向上的终点,每

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值