思路:
1、每条对角线上的元素坐标之和相同为k = i + j,且递增
2、需要遍历的次数为m + n - 1条对角线
3、坐标之和为奇数时从右上向左下放入数组;为偶数时从左下到右上放入数组
4、找出每条对角线开始元素的坐标
例如:(1)坐标和为偶数,起始位置j = max(0,k - m + 1)
(2)坐标和为奇数,起始位置i = max(0,k - n + 1)
代码:
public static int[] findDiagonalOrder(int[][] mat) {
int m = mat.length;
int n = mat[0].length;
int[] matrix = new int[m * n];
int num = 0;
matrix[num++] = mat[0][0];
int i = 0; int j = 0;
int k = 1;
while(k < m + n - 1){
if(k % 2 != 0){
i = Math.max(0, k + 1 - n);
j = k - i;
for (int l = 0; l <= k && i < m && j < n && i >= 0 && j >= 0; l++) {
matrix[num++] = mat[i++][j--];
}
}else{
j = Math.max(0, k + 1 - m);
i = k - j;
for (int l = 0; l <= k && i < m && j < n && i >= 0 && j >= 0; l++) {
matrix[num++] = mat[i--][j++];
}
}
k++;
}
return matrix;
}