携手创作,共同成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情
对角线遍历
给你一个大小为
m x n
的矩阵mat
,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
分析
- 按照题目要求直接模拟即可,重点在于要什么时候向上遍历,什么时候向下遍历,需要找出方向和遍历的行列的规律
- 从0,0的位置开始的时候,方向为向上
- 当方向为向上的时候
- 从左下向右上遍历,行减小列增大
- 当第0行并且列不是最后最后一列的时候方向变为向下,列依次遍历
- 当遍历到最后一列的时候,方向变为向下,行依次遍历
- 当方向为向下的时候
- 从右上到左下的遍历,行增大列减小
- 当第0列并且不是最后一行的时候方向改为向上,行依次遍历
- 当遍历到最后一行时,方向改为向上,列依次遍历
代码
var findDiagonalOrder = function (mat) {
const rowLen = mat.length;
const colLen = mat[0].length;
const total = rowLen * colLen;
const result = [];
let k = 0;
let row = 0;
let col = 0;
let direction = "up";
while (k < total) {
result.push(mat[row][col]);
if (direction === "up") {
if (row === 0 && col < colLen - 1) {
col++;
direction = "down";
} else if (col === colLen - 1) {
row++;
direction = "down";
} else {
row--;
col++;
}
} else {
if (col === 0 && row < rowLen - 1) {
row++;
direction = "up";
} else if (row === rowLen - 1) {
col++;
direction = "up";
} else {
row++;
col--;
}
}
k++;
}
return result;
};
总结
- 对于矩阵有很多的遍历方式,有s形的遍历,有回字形的遍历,有对角线的遍历,面对这类问题,一般都是直接根据题意去模拟遍历方式,然后遍历过程中需要总结遍历的规律,一般和方向有关,通常都是上下左右四个方向,也会有涉及到斜方向,比如这道题。静心思考+分析,难度是不高的
- 今天也是有收获的一天