前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >漫画:一文看懂螺旋矩阵求解

漫画:一文看懂螺旋矩阵求解

作者头像
程序员小浩
发布2020-03-30 16:46:08
1.9K0
发布2020-03-30 16:46:08
举报
文章被收录于专栏:小浩算法小浩算法

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

话不多说,直接看题目。

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]

]

长成这样:

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

代码语言:javascript
复制
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语言示例

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

代码语言:javascript
复制
func spiralOrder(matrix [][]int) []int {
    var result []int
    if len(matrix) == 0 {
        return result
    }
    left, right, up, down := 0, len(matrix[0])-1, 0, len(matrix)-1
    var x, y int
    for left <= right && up <= down {
        for y = left; y <= right && avoid(left, right, up, down); y++ {
            result = append(result, matrix[x][y])
        }
        y--
        up++
        for x = up; x <= down && avoid(left, right, up, down); x++ {
            result = append(result, matrix[x][y])
        }
        x--
        right--
        for y = right; y >= left && avoid(left, right, up, down); y-- {
            result = append(result, matrix[x][y])
        }
        y++
        down--
        for x = down; x >= up && avoid(left, right, up, down); x-- {
            result = append(result, matrix[x][y])
        }
        x++
        left++
    }
    return result
}

func avoid(left, right, up, down int) bool {
    return up <= down && left <= right
}

最后再自恋一把:

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小浩算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档