给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素。
这题的两个要点:
1.对下标的五种情况的判断
2.对传入的二维数组是:空数组,单行数组,单列数组的处理
class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
//数组不存在或为空
if(matrix ==null || matrix.length==0) {
return new int[0];
}
int[] arr =null;
//只有一行的情况
if(matrix.length==1) {
arr = new int[matrix[0].length];
for(int i=0;i<matrix[0].length;i++) {
arr[i] = matrix[0][i];
}
return arr;
}
//只有一列的情况
if(matrix[0].length==1) {
arr = new int[matrix.length];
for(int i=0;i<matrix.length;i++) {
arr[i] = matrix[i][0];
}
return arr;
}
int hang = matrix.length;
int lie = matrix[0].length;
arr = new int[hang*lie]; //一维数组创建
int i=0,j=0; //二维数组下标遍历
int index =0; //一维数组下标遍历
//循环二维数组
while(i!=hang-1 || j!=lie-1) {
arr[index] = matrix[i][j];
index++;
//i+j为偶数则右上遍历
if((i+j)%2==0) {
//向上到头,右边还有元素则往右走
if(i==0 && j!=lie-1) {
j++;
//向上到头,右也到头;或向上未到头,向右到头时,则向下走
}else if(j==lie-1) {
i++;
}else {
i--;
j++;
}
//i+j为奇数则左下遍历
}else {
//向左到头,向下还有元素,则向下走
if(j==0 && i!=hang-1) {
i++;
//向左向下都到头,或向下到头,向左未到头,都向左走
}else if(i==hang-1) {
j++;
//正常左下走
}else {
i++;
j--;
}
}
}
//最后一个元素的赋值
arr[arr.length-1] = matrix[hang-1][lie-1];
return arr;
}
}