给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出:[1,2,4,7,5,3,6,8,9]
思路:
首先如何判断是朝上还是朝下,如果数组的下标相加对2取余等于0,说明是朝上,不等于0则是朝下。
## 当方向向上时,有三种情况。
l是二维数组的列数,h为二维数组的行数,i和j分别数组的下标。
1、如果(i == 0 && j != l - 1) 然后 j++
这种情况就是横坐标到达顶点需要转换方向,此时的转换方向实际就是j++,也就是列坐标加1。如图中的(1 -> 2)就是这种情况。
2、如果 (j == l - 1) 然后i++
这种情况实际就是列坐标到达最大值,此时如果转换方向,就需要将行坐标加1,如图中的(3 ->6)就是这种情况。
3、i++ 并且 j++
如图中的(7->5)和(5->3)就是这种情况
## 当方向向下时,有三种情况
1、如果 (j == 0 && i != h - 1) 然后 i++
这种情况就是列坐标值达到最大,行坐标值不是最大,如图中的(4->7)。
2、如果 (i == h - 1)然后 j++
这种情况就是行坐标值达到最大,需要列坐标值加1,如图中的(8->9)。
3、i++ 和 j- -
如图中的(2->4)和(6->8)。
代码:
class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
//判断数组是否为空
if(matrix == null || matrix.length == 0){
return new int[] {};
}
//判断数组是否仅一行
if(matrix.length == 1){
return matrix[0];
}
//判断数组是否仅一列
int[] nn = new int[matrix.length];
if(matrix[0].length == 1){
for(int i = 0; i < matrix.length; i++){
nn[i] = matrix[i][0];
}
return nn;
}
int h = matrix.length; //多少行
int l = matrix[0].length; //多少列
int[] num = new int[h * l]; //创建新数组存存储最后输出结果
int index = 0; //num数组的下标
int i = 0; //行坐标
int j = 0; //列坐标
while(i < h && j < l){ //只要满足这个条件就一直循环
num[index++] = matrix[i][j]; //每一次循环之前都将赋值给这个数组
if((i + j) % 2 == 0){ //如果等于0说明是朝上的方向
if(i == 0 && j != l - 1){ //第一种情况
j++; //列坐标加1
} else if(j == l - 1){
i++; //行坐标加1
} else {
i--;
j++;
}
} else {
if(j == 0 && i != h - 1){
i++;
} else if(i == h - 1){
j++;
} else{
i++;
j--;
}
}
}
return num; //返回新数组
}
}