【每日一题】498对角线遍历

122 阅读1分钟

(498. 对角线遍历 - 力扣(LeetCode))

三种方法

  1. 模拟法 根据每条对角线方向不同往结果插入mat[i][j]
  2. 更易理解的模拟法 默认每条对角线都是左下方向, 设置中间变量,决定是正向插入还是反向插入
  3. 状态机法 也是我唯一看懂的 设置初始方向和方向变量,之后用统一的步骤处理
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
}