当前位置:首页 > 单片机 > 后端技术指南针
[导读]今天为大家分享一道关于螺旋矩阵的问题。 话不多说,直接看题目。 01 第54题:螺旋矩阵 第54题:定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入: [  [ 1, 2, 3 ],  [ 4, 5, 6 ],  [ 7, 8, 9 ] ]

今天为大家分享一道关于螺旋矩阵的问题。

话不多说,直接看题目。


01
第54题:螺旋矩阵


第54题:定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:

[

 [ 1, 2, 3 ],

 [ 4, 5, 6 ],

 [ 7, 8, 9 ]

]

输出: [1,2,3,6,9,8,7,4,5]


示例 2:

输入:

[

  [1, 2, 3, 4],

  [5, 6, 7, 8],

  [9,10,11,12]

]

输出: [1,2,3,4,8,12,11,10,9,5,6,7]


(题目有一定难度,如果没有思路,可以先打两把王者...)


02
题目分析


本题的思路,在于模拟螺旋的移动轨迹

问题的难点,在于想明白模拟过程中会遇到什么问题

那模拟的过程中会遇到什么样的问题?边界处理


因为只有我们能找到边界(边界包括:1、数组的边界 2、已经访问过的元素),才可以通过“右,下,左,上”的方向来进行移动。同时,每一次碰壁,就可以调整到下一个方向。


思路明确了,我们看一下整个过程。假如我们的数组为:

[

  [1, 2, 3, 4],

  [5, 6, 7, 8],

  [9,10,11,12]

]


长成这样:


我们首先对其设置好四个边界:

up := 0
down := len(matrix) - 1
left := 0
right := len(matrix[0]) - 1


长成这样:

同时,我们定义x和y,来代表行和列。

如x=2,y=1,则 arr[2][1]=10(第3行第2列)

然后我们从第一个元素开始行军(y=left),完成第一行的遍历,直到碰壁。(y<=right)

下面关键的一步来了,因为第一行已经走过了,我们将上界下调(up++),同时转弯向下走。

直到碰到底部时(x<=down),我们将右界左调(right--),转弯向左走。

后面向左和向上,分别完成下界上调(down--)左界右调(left++)

最后,对剩下的矩阵重复整个过程,直到上下、左右的壁与壁碰在一起(up <= down && left <= right,这是避免碰壁的条件)


03
Go语言示例


所以这道题很简单,只要会碰壁,就可以顺利得到代码(很漂亮,不是吗?):


 1func spiralOrder(matrix [][]int) []int {
2    var result []int
3    if len(matrix) == 0 {
4        return result
5    }
6    left, right, up, down := 0len(matrix[0])-10len(matrix)-1
7    var x, y int
8    for left <= right && up <= down {
9        for y = left; y <= right && avoid(left, right, up, down); y++ {
10            result = append(result, matrix[x][y])
11        }
12        y--
13        up++
14        for x = up; x <= down && avoid(left, right, up, down); x++ {
15            result = append(result, matrix[x][y])
16        }
17        x--
18        right--
19        for y = right; y >= left && avoid(left, right, up, down); y-- {
20            result = append(result, matrix[x][y])
21        }
22        y++
23        down--
24        for x = down; x >= up && avoid(left, right, up, down); x-- {
25            result = append(result, matrix[x][y])
26        }
27        x++
28        left++
29    }
30    return result
31}
32
33func avoid(left, right, up, down int) bool {
34    return up <= down && left <= right
35}


最后再自恋一把:





注:本系列所有教程中都不会用到复杂的语言特性,大家不需要担心没有学过相关语法。算法思想最重要,使用各语言纯属本人爱好。同时,所有代码均在leetcode上进行过测试运行,保证其严谨性!



每天一道图解算法,如需进群 ↓↓↓

欢迎加微信llhaohao



转发是对我最大的支持!




温馨提示



小浩算法~

每天一起学习图解漫画算法。

一起刷题,一起成长!

~长按下方二维码进行关注吧~


关注领取 "GeekTime" 全部资源



免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭