算法练习第31题-对角线遍历

188 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

一、题目

给你一个大小为 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]

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/di…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思考

* (0, 0)    (0, 1)
 *           (1, 0) 
 * 0,0 => 1  0,1 => 2
 *           1,0 => 4 
 *                    (2, 0)
 *                    (1, 1)
 *                    (0, 2)
 *                    2,0 => 7
 *                    1,1 => 5
 *                    0,2 => 3
 *                            
 *                             (1, 2)
 *                             (2, 1) 
 *                             1,2 => 6
 *                             2,1 => 8
 *                                      (2, 2)
 *                                      2,2 => 9
 * 
 * [1,2,4,7,5,3,6,8,9]
  • 这个解题思路来源于leetCode

  • 首先看上边的坐标排序

  • 1 -> 0

  • 2,4 -> 1

  • 7,5,3 -> 2

  • 6,8 -> 3

  • 9 -> 4

  • 这里根据下标和push数据到数组中

  • 这里是用new Map,得到了多个数组

  • 判断当前是否存在key,如果存在的不在新加入key

  • 这样得到的key的列表分别是0,1,2,3,4

  • 当key为0时,这里push的数值只有1

  • 当key为1时,这里push的数值有2,4

  • 当key为2时,这里push的数值为3,5,7

  • 当key为3时,这里push的数值为6,8

  • 当key为4时,这里push的数值为9

  • 此时,我们开始遍历map数组

  • 这里有一个数组进入顺序问题,

  • 得到的数组是[1,2,4,7,5,3,6,8,9]

  • 那么0不看

  • key为1时是顺序2,4

  • key为2是为倒序

  • key为3时为正序

  • key为4时为倒序

  • 那么得到的结论是当key能被2整除时倒序,不能整除时正序

三、代码

let findDiagonalOrder = function(mat) {
  /**
   * 这个解题思路来源于leetCode
   * 首先看上边的坐标排序
   * 1 -> 0
   * 2,4 -> 1
   * 7,5,3 -> 2
   * 6,8 -> 3
   * 9 -> 4
   * 
   * 这里根据下标和push数据到数组中
   * 这里是用new Map,得到了多个数组
   * 判断当前是否存在key,如果存在的不在新加入key
   * 这样得到的key的列表分别是0,1,2,3,4
   * 当key为0时,这里push的数值只有1
   * 当key为1时,这里push的数值有2,4
   * 当key为2时,这里push的数值为3,5,7
   * 当key为3时,这里push的数值为6,8
   * 当key为4时,这里push的数值为9
   * 
   * 此时,我们开始遍历map数组
   * 这里有一个数组进入顺序问题, 
   * 得到的数组是[1,2,4,7,5,3,6,8,9]
   * 那么0不看
   * key为1时是顺序2,4 
   * key为2是为倒序
   * key为3时为正序
   * key为4时为倒序
   * 那么得到的结论是当key能被2整除时倒序,不能整除时正序
   * */ 

  const row = mat.length
  const col = mat[0].length
  const newMap = new Map()
  for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
      const key = i + j
      if (!newMap.has(key)) {
        newMap.set(key, [])
      }
      newMap.get(key).push(mat[i][j])
    }
  }
  const result = []
  for (const [key, nums] of newMap.entries()) {
    key % 2 === 0 ? result.push(...nums.reverse()): result.push(...nums)
  }
  return result
}
findDiagonalOrder(mat)

四、测试结果

image.png