(498. 对角线遍历 - 力扣(LeetCode))
三种方法
- 模拟法 根据每条对角线方向不同往结果插入mat[i][j]
- 更易理解的模拟法 默认每条对角线都是左下方向, 设置中间变量,决定是正向插入还是反向插入
- 状态机法 也是我唯一看懂的 设置初始方向和方向变量,之后用统一的步骤处理
func findDiagonalOrder(mat [][]int) []int {
dirs := [][]int{{-1, 1}, {1, -1}}
m, n := len(mat), len(mat[0])
i, j := 0, 0
curDir := 0
ret := make([]int, 0, m*n)
for i < m && j < n {
dir := dirs[curDir]
for {
ret = append(ret, mat[i][j])
newI, newJ := i+dir[0], j+dir[1]
if newI < 0 || newI >= m || newJ < 0 || newJ >= n {
break
}
i, j = newI, newJ
}
if curDir == 0 {
if j == n-1 {
i++
} else {
j++
}
curDir = 1
} else {
if i == m-1 {
j++
} else {
i++
}
curDir = 0
}
}
return ret
}