题目
给你一个大小为 m x n
的矩阵 mat
,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
输入:mat = [[1,2],[3,4]] 输出:[1,2,3,4]
思路
一共有 m+n−1 条对角线,相邻的对角线的遍历方向不同,当前遍历方向为从左下到右上,则紧挨着的下一条对角线遍历方向为从右上到左下;
1. 设对角线从上到下的编号为 i , 对应取值范围是 [ 0 , m+n−2 ]
当 i 为偶数时,则第 iii 条对角线的走向是从下往上遍历;
当 i 为奇数时,则第 iii 条对角线的走向是从上往下遍历;
2. 当第 i 条对角线从下往上遍历时,每次行索引减 1,列索引加 1,直到矩阵的边缘为止:
当 i < m 时,则此时对角线遍历的起点位置为 ( i , 0);
当 i ≥ m 时,则此时对角线遍历的起点位置为 ( m−1 , i−m+1 );
3.当第 i 条对角线从上往下遍历时,每次行索引加 1,列索引减 1,直到矩阵的边缘为止:
当 i < n 时,则此时对角线遍历的起点位置为 ( 0 , i );
当 i ≥ n 时,则此时对角线遍历的起点位置为 ( i−n+1 , n−1 );
代码
class Solution {
public int[] findDiagonalOrder(int[][] mat) {
int m = mat.length;
int n = mat[0].length;
int[] res = new int[m * n];
int pos = 0;
for (int i = 0; i < m + n - 1; i++) {
if (i % 2 == 1) {
int x = i < n ? 0 : i - n + 1;
int y = i < n ? i : n - 1;
while (x < m && y >= 0) {
res[pos] = mat[x][y];
pos++;
x++;
y--;
}
} else {
int x = i < m ? i : m - 1;
int y = i < m ? 0 : i - m + 1;
while (x >= 0 && y < n) {
res[pos] = mat[x][y];
pos++;
x--;
y++;
}
}
}
return res;
}
}