[LeetCode] 498. Diagonal Traverse

对角线遍历。题意是给一个二维数组,按照规则遍历,输出一个一维数组。例子,

Example:

Input:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

Output:  [1,2,4,7,5,3,6,8,9]

这个题没有什么算法,难点是如何判断到底是往上扫描还是往下扫描以及如何判断边界条件。

首先发现如果是从左下往右上遍历,遍历到的点的横纵坐标的加和(x+y)% 2 === 0;如果是从右上往左下遍历,遍历到的点的横纵坐标的加和(x+y)% 2 === 1。这是一个仅限于这一题的结论。碰到边界条件只有两种可能,一是左下往右上走的时候确保纵坐标不要超出右边的边界和横坐标不要小于0;二是右上往左下走的时候确保横坐标不要小于0和纵坐标不要超出左边的边界。

时间O(m * n)

空间O(m * n) - 存储output

 1 /**
 2  * @param {number[][]} matrix
 3  * @return {number[]}
 4  */
 5 var findDiagonalOrder = function (matrix) {
 6     // corner case
 7     if (matrix.length === 0) {
 8         return [];
 9     }
10 
11     // normal case
12     let row = 0;
13     let col = 0;
14     let m = matrix.length;
15     let n = matrix[0].length;
16     let res = [];
17     for (let k = 0; k < m * n; k++) {
18         res.push(matrix[row][col]);
19         // moving up
20         if ((row + col) % 2 === 0) {
21             if (col === n - 1) {
22                 row++;
23             } else if (row === 0) {
24                 col++;
25             } else {
26                 row--;
27                 col++;
28             }
29         }
30         // moving down
31         else {
32             if (row === m - 1) {
33                 col++;
34             } else if (col === 0) {
35                 row++;
36             } else {
37                 row++;
38                 col--;
39             }
40         }
41     }
42     return res;
43 };

猜你喜欢

转载自www.cnblogs.com/aaronliu1991/p/12381417.html