「LeetCode」498-对角线遍历

111 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

一.题目:

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

示例 1:

image.png

输入: 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 <= 10^4
  • 1 <= m * n <= 10^4
  • -10^5 <= mat[i][j] <= 10^5

二、思路分析:

首先这是一道图形题,我们需要通过图形来发现规律后在进行问题的解答,因为题目是要求我们遍历出这个矩阵的所有元素,限制是必须从对角线遍历,而我们通过图形可以知道:

  1. 一个m x n的矩阵是一共有着m+n-1条对角线可以进行遍历的,而相邻两条对角线的遍历顺序又是不一样的;
  2. 对于i0开始计数,i偶数的时候是从左下到右上开始遍历的,而奇数的时候是从右上到左下遍历的,所以需要找到规律,需要注意一旦超过m或者n都需要进行位置的判断。

注意:需要注意到每个循环的边界条件,以免超出边界。

三、代码:

function findDiagonalOrder(mat: number[][]): number[] {
    // 通过规律发现有m+n-1个对角线
    let m = mat.length;
    let n = mat[0].length;
    let res = new Array(m * n).fill(0);
    let point = 0;
    for(let i = 0 ; i < m + n - 1 ; i++){
        if(i % 2 == 0){
            let x = i < m ? i : m - 1;
            let y = i < m ? 0 : i - m + 1; 
            while(x>=0 && y < n){
                res[point] = mat[x][y];
                x--;
                y++;
                point++;
            }
        }else{
            let x = i < n ? 0 : i - n + 1;
            let y = i < n ? i : n - 1; 
            while(x < m && y >= 0){
                res[point] = mat[x][y];
                x++;
                y--;
                point++;
            }
        }
    }
    return res
};

四、总结:

我们在做图形题的时候一定要善于发现规律,因为这样的题目一定是通过规律进行作答的而不是靠大量的ifelse搭配作答。这道题本质上应该算是一道数学题,因为没有用到什么算法思想。