一、题目1:对角线遍历I
(1)题目
给你一个大小为 m x n
的矩阵 mat
,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
(2)思路
根据题目描述,首先仔细找一下这道题中一些数字上的规律。
(可以结合题目给的图来看)
(3)实现
/**
* @param {number[][]} mat
* @return {number[]}
*/
var findDiagonalOrder = function(arr) {
let m = arr.length; //m行
let n = arr[0].length; //n列
let i = 0; //i是x+y的和
let res = [];
while(i<m+n-1){
//1. 奇数趟(从下往上,从左向右,即向上右斜)。即1 3 5 ...
let x1 = (i<m) ? i : m-1; //确定 x y 的初始值
let y1 = i-x1;
while(x1>=0 && y1<n){ //遍历一趟
res.push(arr[x1][y1]);
x1--;
y1++;
}
i++; //遍历完一个对角线,i值加1
//2. 偶数趟(从上往下,从右向左,即向下左斜)
let y2 = (i<n) ? i : n-1; //确定 x y 的初始值
let x2 = i-y2;
while(x2<m && y2>=0){ //遍历一趟
res.push(arr[x2][y2])
x2++;
y2--;
}
i++;
}
return res;
};