持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
一.题目:
498. 对角线遍历 给你一个大小为
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]
提示:
m == mat.lengthn == mat[i].length1 <= m, n <= 10^41 <= m * n <= 10^4-10^5 <= mat[i][j] <= 10^5
二、思路分析:
首先这是一道图形题,我们需要通过图形来发现规律后在进行问题的解答,因为题目是要求我们遍历出这个矩阵的所有元素,限制是必须从对角线遍历,而我们通过图形可以知道:
- 一个
m x n的矩阵是一共有着m+n-1条对角线可以进行遍历的,而相邻两条对角线的遍历顺序又是不一样的; - 对于
i从0开始计数,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
};
四、总结:
我们在做图形题的时候一定要善于发现规律,因为这样的题目一定是通过规律进行作答的而不是靠大量的if和else搭配作答。这道题本质上应该算是一道数学题,因为没有用到什么算法思想。