对角线遍历。题意是给一个二维数组,按照规则遍历,输出一个一维数组。例子,
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 };