Leetcode--Java--498. 对角线遍历

这篇博客介绍了如何按对角线顺序遍历一个m x n的矩阵。通过找规律、分类讨论和处理边界条件,结合对称性原理,解析了矩阵遍历的路径。文章详细阐述了右上和左下两种方向的遍历策略,并特别关注了边界和对称性的特殊情况。

题目描述

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

样例描述

在这里插入图片描述

思路

找规律 + 分类讨论 + 边界处理 + 对称原理
本题直接分析走向,依据走向来模拟,先找好右上和左下交换的规律,在着重分析其中一种的情况,主要是边界情况,另外一种由对称性可易得

  1. 分析遍历的路径,主要是右上和左下两种方向。假设放入坐标轴,不难发现右上时,x和y坐标之和为偶数,左下时坐标之和为奇数。因此可以分为两类
  2. 考虑右上的边界情况,如果在第一行,y要加一(变向),如果在最后一列x要加一(变向),其余正常情况就是x减一,y加一。 由对称原理,不妨假设90度翻转矩阵,横轴坐标颠倒,待遍历的路径还是一样,只是坐标的表示意义不一样,本质走向是一样的。所以直接将右上情况的x变成y,y变成x就是左下的情况
  3. 隐藏特殊细节左右上角的处理,对于右上角的位置,如果是右上的话,要先判断列再判断行,防止先行的话向右走就越界。 同理对称性,左下角也是

代码

class Solution {
    public int[] findDiagonalOrder(int[][] mat) {
        int m = mat.length, n = mat[0].length;
        int res[] = new int[m * n];
        int k = 0;
        int x = 0, y = 0; //从坐标[x, y]开始
        while (k < m * n) {
            res[k ++] = mat[x][y];
            //如果坐标之和是偶数,就是右上
            if ((x + y) % 2 == 0) {
                //先考虑边界
                //右上先判断列,是否最后一列,(防止在右上角的话向右边走越界)
                if (y == n - 1) x ++;
                //如果是第一行
                else if (x == 0) y ++;
                //其余非边界情况
                else {
                    y ++;
                    x --;
                }
            }
            //左下的情况,直接由对称性,将上面的x和y,m和n互换即可
            else {
                if (x == m - 1) y ++;
                else if (y == 0) x ++;
                else {
                    x ++;
                    y --;
                }
            }
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值