写点什么

每日一题:LeetCode-498. 对角线遍历

作者:半亩房顶
  • 2024-01-29
    北京
  • 本文字数:1008 字

    阅读完需:约 3 分钟

每日一题:LeetCode-498. 对角线遍历

刷题使我快乐,满脸开心.jpg



题目

给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。


示例 1:



输入:mat = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,4,7,5,3,6,8,9]
复制代码


示例 2:


输入:mat = [[1,2],[3,4]]输出:[1,2,3,4]
复制代码


提示:


  • m == mat.length

  • n == mat[i].length

  • 1 <= m, n <= 104

  • 1 <= m * n <= 104

  • -105 <= mat[i][j] <= 105

思路

直接去模拟这个过程就好,注意边界的判断、不同情况下行为模式的变化就 OK,没太多复杂的思路和机制~


直接上代码,细节在注释了

代码

func findDiagonalOrder(mat [][]int) []int {    m, n, i, j := len(mat), len(mat[0]), 0, 0
// 用一个方向表明是要斜向上扫描还是斜向下扫描 // 斜向上那就扫到出界后,尝试往右移动一个,往右出界就往下移动一个 // 斜向下那就扫到出界后,尝试往下移动一个,往下出界就往右移动一个 direction := true var getNext func() getNext = func() { switch direction { case true: if j+1 >= n { i++ } else { j++ } case false: if i+1 >= m { j++ } else { i++ } } direction = !direction }
res := make([]int, 0, m*n) // 这一层就是保证getNext()无论怎么移动一个都出界时候,说明就扫描完了 for i < m && j < n && i >= 0 && j >= 0 { switch direction { case true: for i < m && j < n && i >= 0 && j >= 0 { res = append(res, mat[i][j]) i-- j++ } // 回退。可以优化,但是优化后理解成本变高 i++ j-- case false: for i < m && j < n && i >= 0 && j >= 0 { res = append(res, mat[i][j]) i++ j-- } // 同回退 i-- j++ } // 寻找下一个起始遍历点 getNext() } return res}
复制代码




欢迎关注公众号交流更多题目~


发布于: 刚刚阅读数: 3
用户头像

半亩房顶

关注

人生那么长,能写多少bug? 2018-11-16 加入

我希望,自己永远是自己。我希望,远离bug。

评论

发布
暂无评论
每日一题:LeetCode-498. 对角线遍历_Go_半亩房顶_InfoQ写作社区