力扣网-498对角线遍历(Java)

给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。

示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出:[1,2,4,7,5,3,6,8,9]

力扣网-498对角线遍历(Java)_第1张图片

思路:
首先如何判断是朝上还是朝下,如果数组的下标相加对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;	//返回新数组
    }
}

你可能感兴趣的:(对角线遍历,力扣,java题,遍历)