Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.
Example:
Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,4,7,5,3,6,8,9] Explanation:Note:
The total number of elements of the given matrix will not exceed 10,000.
对角线遍历。
题意是给一个二维数组,按照规则遍历,输出一个一维数组。
这个题没有什么算法,难点是如何判断到底是往上扫描还是往下扫描以及如何判断边界条件。
首先发现如果是从左下往右上遍历,每个遍历到的点的横纵坐标的加和(x+y)% 2 == 0,比如1的坐标是(0,0),7的坐标是(0,2),5的坐标是(1,1);如果是从右上往左下遍历,遍历到的点的横纵坐标的加和(x+y)% 2 == 1,比如2的坐标(1,0),4的坐标(0,1)。这是一个仅限于这一题的结论。碰到边界条件只有两种可能,一是左下往右上走的时候确保纵坐标不要超出右边的边界和横坐标不要小于0;二是右上往左下走的时候确保横坐标不要大于矩阵的高和纵坐标不要超出左边的边界。
时间O(mn)
空间O(mn) - 存储output
JavaScript实现
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 };
Java实现
注意一定要先写18行和27行否则会越界,因为往右上走的时候,先越界的一定是col;往左下走的时候,先越界的一定是row。
1 class Solution { 2 public int[] findDiagonalOrder(int[][] matrix) { 3 // corner case 4 if (matrix == null || matrix.length == 0) { 5 return new int[0]; 6 } 7 8 // normal case 9 int row = 0; 10 int col = 0; 11 int m = matrix.length; 12 int n = matrix[0].length; 13 int[] res = new int[m * n]; 14 for (int i = 0; i < res.length; i++) { 15 res[i] = matrix[row][col]; 16 // moving up 17 if ((row + col) % 2 == 0) { 18 if (col == n - 1) { 19 row++; 20 } else if (row == 0) { 21 col++; 22 } else { 23 row--; 24 col++; 25 } 26 } else { 27 if (row == m - 1) { 28 col++; 29 } else if (col == 0) { 30 row++; 31 } else { 32 row++; 33 col--; 34 } 35 } 36 } 37 return res; 38 } 39 }