本文是个人的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
}