LeetCode笔记04:对角线遍历

本文是个人的leetcode刷题笔记,记录做题的题解以及思想,方便往后的复习,题目如下:题目链接
在这里插入图片描述本题思路: 根据当前对角线的编号计算该对角线的起点位置,再根据对角线的方向进行遍历添加进入结果数组,当对角线进入边缘时停止,在下一次循环中重新计算对角线的起点。其关键在于下图:
在这里插入图片描述
代码如下:

func findDiagonalOrder(mat [][]int) []int {
    len1,len2:=len(mat),len(mat[0])
    res:=make([]int,0,len1*len2)
    //根据矩阵的规律,矩阵共有长+宽-1条对角线,其中i表示对左上到右下对角线进行编号,当对角线编号为复数时为向上移动,为单数时向下移动
     for i := 0; i < len1+len2-1; i++{
        if i%2==0{//当对角线向上移动时
            //计算对角线起点位置,当i<len1-1时,即起点还没越过中对角线,此时起点为x=i、y=0,越过后变为x=len1-1,y=i-len1+1
            x:=min(i,len1-1)
            y:=max(i-len1+1,0)
            for x>=0&&y<len2{
                res=append(res,mat[x][y])
                y++
                x--
            }
        }else if i%2==1{//当对角线向下移动时
            //计算对角线起点位置,当i<len2-1时,即起点还没越过中对角线,此时起点为x=0、y=i,越过后变为x=i-len2+1,y=len2-1
            y := min(i,len2-1)
            x := max(i-len2+1,0)
            for x<len1&&y>=0{
                res=append(res,mat[x][y])
                y--
                x++
            }
        }
    }
    return res
}

func max(a int, b int) int{
    if a>b{return a}
    return b
}
func min(a int, b int) int{
    if a<b{return a}
    return b
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值