一起刷LeetCode——对角线遍历(模拟)

49 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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形的遍历,有回字形的遍历,有对角线的遍历,面对这类问题,一般都是直接根据题意去模拟遍历方式,然后遍历过程中需要总结遍历的规律,一般和方向有关,通常都是上下左右四个方向,也会有涉及到斜方向,比如这道题。静心思考+分析,难度是不高的
  • 今天也是有收获的一天