力扣网-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]

在这里插入图片描述

思路:
首先如何判断是朝上还是朝下,如果数组的下标相加对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;	//返回新数组
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值