美文网首页Leetcode分类题解(golang)
[Leetcode][数组][遍历] 54. 螺旋矩阵

[Leetcode][数组][遍历] 54. 螺旋矩阵

作者: 暖暖轻风 | 来源:发表于2020-01-30 19:54 被阅读0次

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]

代码,第一版:

func spiralOrder(matrix [][]int) []int {
    var ret []int
    lenR:=len(matrix)
    if lenR==0{
        return []int{}
    }
    lenC:=len(matrix[0])
    r:=0 //row
    c:=0 //column
    d:=0//遍历方向
    circle:=0//第几圈
    for l:=0;l<lenR*lenC;l++{ //关键点一:循环终止条件
        ret = append(ret,matrix[r][c])//关键点二:保证每次循环都遍历一个点
        if d==0{//向右
            if c+1<lenC-circle {//关键点三:确认方向转换的边界
                c++
            } else {
                r++
                d=1
            }
        } else if d==1 { //向下
            if r+1<lenR-circle {
                r++
            } else {
                c--
                d=2
            }
        } else if d==2 {//向左
            if c-1>= circle {
                c--
            } else {
                r--
                d=3
            }
        } else { //向上
            if r-1>circle {
                r--
            } else {
                c++
                d=0
                circle++
            }
        }
    }
    return ret
}

简化版代码:

func spiralOrder(matrix [][]int) []int {
    var ret []int
    lenR:=len(matrix)
    if lenR==0{
        return []int{}
    }
    lenC:=len(matrix[0])
    c:=0
    r:=0
    dc:=1//c的自增量
    dr:=0//r的自增量
    d:=0
    circle:=0
    for l:=0;l<lenR*lenC;l++{
        ret = append(ret,matrix[r][c])
        if (d%4==0&&c+1>=lenC-circle) || (d%4==1&&r+1>=lenR-circle) || (d%4==2&&c-1<circle) ||(d%4==3&&r-1<=circle){
            dr,dc=dc,-dr
            if d%4==3&&r-1<=circle {
                circle++
            }
            d++
        }
        r+=dr
        c+=dc
    }
    return ret
}

原理:

方向 dr dc
0 1
1 0
0 -1
-1 0

所以可以用表达式dr,dc=dc,-dr覆盖上面的情况

总结

写代码时,要注意使用更优雅的方法减少if。

相关文章

网友评论

    本文标题:[Leetcode][数组][遍历] 54. 螺旋矩阵

    本文链接:https://www.haomeiwen.com/subject/xqfwthtx.html