每日一练:LeeCode-498、对角线遍历【二维数组+边界判断】

给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序用一个数组返回这个矩阵中的所有元素

示例 1:
在这里插入图片描述

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

输入:mat = [[1,2],[3,4]]
输出:[1,2,3,4]

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 10^4
  • 1 <= m * n <= 10^4
  • 10 ^ 5 <= mat[i][j] <= 10^5

代码实现

public static int[] findDiagonalOrder(int[][] matrix) {
    if (matrix.length == 0) {
        return new int[0]; // 如果矩阵为空,则返回空数组
    }
    int m = matrix.length; // 获取矩阵的行数
    int n = matrix[0].length; // 获取矩阵的列数

    int[] ans = new int[m * n]; // 初始化存放结果的一维数组
    int count = n + m - 1; // 对角线方向次数,即矩阵的行数加列数减1
    int row = 0, col = 0, Index = 0; // 初始化行标记、列标记和存放数组的索引

    for (int i = 0; i < count; i++) { // 循环遍历对角线次数
        if (i % 2 == 0) { // 如果当前是偶数次对角线,则从右上角开始遍历
            while (row >= 0 && col < n) { // 右上遍历
                ans[Index] = matrix[row][col]; // 将矩阵中的元素存入结果数组
                Index++; // 索引后移
                row--; // 行减一
                col++; // 列加一
            }
            if (col < n) { // 判断是否越界
                row++; // 如果不越界,正常行加一
            } else { // 如果越界,则是最长的左下对角线
                row += 2; // 行加二
                col--; // 列减一
            }
        } else { // 如果当前是奇数次对角线,则从左下角开始遍历
            while (row < m && col >= 0) { // 左下遍历,与右上相反
                ans[Index] = matrix[row][col]; // 将矩阵中的元素存入结果数组
                Index++; // 索引后移
                row++; // 行加一
                col--; // 列减一
            }
            if (row < m) { // 判断是否越界
                col++; // 如果不越界,正常列加一
            } else { // 如果越界,则是最长的右上对角线
                row--; // 行减一
                col += 2; // 列加二
            }
        }
    }
    return ans; // 返回存放结果的数组
}

详细说明:

  • 首先检查输入矩阵是否为空,如果为空则直接返回一个空数组。
  • 然后获取矩阵的行数 m 和列数 n
  • 初始化存放结果的一维数组 ans,其长度为 m * n
  • 初始化对角线方向的次数 count,即矩阵的行数加列数减1。
  • 初始化行标记 row、列标记 col 和存放数组的索引 Index,分别表示当前位置的行、列以及存放数组的索引。
  • 开始对角线循环,循环次数为 count
  • 在循环中,根据当前对角线次数的奇偶性,选择从右上或左下开始遍历矩阵。
  • 在遍历过程中,根据遍历的方向将矩阵中的元素存入结果数组,并更新行标记和列标记。
  • 在遍历完成后,返回存放结果的数组 ans
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小孔靠得住

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值