498. 对角线遍历
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
说明:
给定矩阵中的元素总数不会超过 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
}
这道题有两个难点:
- 边界的判断:向右上时,可能会遇到两个边界,右和上。左下同理。
- 方向的切换