[Leetcode][数组][遍历] 498. 对角线遍历

作者: raisecrow | 来源:发表于2020-01-29 12:53 被阅读0次

498. 对角线遍历

给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:

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

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

解释:


image.png

说明:

给定矩阵中的元素总数不会超过 100000 。

解法:

func findDiagonalOrder(matrix [][]int) []int {
    if len(matrix)==0{
        return []int{}
    }
    r:=0//row
    c:=0//column
    d:=1//  1为向右上遍历,-1为向左下遍历。也可以用r+c的奇偶来判断方向
    ret :=[]int{}
    maxR:=len(matrix)-1
    maxC:=len(matrix[0])-1
    for l:=0;l<len(matrix)*(len(matrix[0]));l++{
        ret=append(ret,matrix[r][c])
        if d==1{ //右上
            if c==maxC{//先判断column是否为最大值,这样就不用担心row越界。因为column和row同时达到最大值时,循环会自动退出
                r+=1
                d=-1
            } else if r==0 {
                c+=1
                d=-1
            } else {
                c+=1
                r-=1
            }
        } else {//左下
            if r==maxR{//这里也是,先判断row是否最大值
                c+=1
                d=1
            } else if c==0 {
                r+=1
                d=1
            } else {
                c-=1
                r+=1
            }
        }
    }
    return ret
}

这道题有两个难点:

  1. 边界的判断:向右上时,可能会遇到两个边界,右和上。左下同理。
  2. 方向的切换

相关文章

网友评论

    本文标题:[Leetcode][数组][遍历] 498. 对角线遍历

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