题目
给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
示例
输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]
解析
本题目主要考察的就是模拟法,首先可以计算得出,对角线的个数为m+n-1,在此基础上对于对角线进行遍历(从0开始),则第偶数条为从左下到右上,第奇数条为从右上到左下,根据奇数偶数来确定走什么遍历逻辑。
在遍历的过程中,由于边界值并不固定,每次处理的时候需要判断起点的横纵坐标值:
func findDiagonalOrder(mat [][]int) (ans []int) {
m := len(mat)
n := len(mat[0])
var x, y int
for i := 0; i < m+n-1; i++ { // 对角线的个数
if i%2 == 0 {
// 偶数,从左下到右上
if i < m {
x, y = i, 0
} else {
x, y = m-1, i-m+1
}
for x >= 0 && y < n {
ans = append(ans, mat[x][y])
x--
y++
}
} else {
// 奇数,从右上到左下
if i < n {
x, y = 0, i
} else {
x, y = i-n+1, n-1
}
for x < m && y >= 0 {
ans = append(ans, mat[x][y])
x++
y--
}
}
}
return
}