一起养成写作习惯!这是我参与「掘金日新计划 · 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)