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

思路
找规律 + 分类讨论 + 边界处理 + 对称原理
本题直接分析走向,依据走向来模拟,先找好右上和左下交换的规律,在着重分析其中一种的情况,主要是边界情况,另外一种由对称性可易得
- 分析遍历的路径,主要是右上和左下两种方向。假设放入坐标轴,不难发现右上时,x和y坐标之和为偶数,左下时坐标之和为奇数。因此可以分为两类
- 考虑右上的边界情况,如果在第一行,y要加一(变向),如果在最后一列x要加一(变向),其余正常情况就是x减一,y加一。 由对称原理,不妨假设90度翻转矩阵,横轴坐标颠倒,待遍历的路径还是一样,只是坐标的表示意义不一样,本质走向是一样的。所以直接将右上情况的x变成y,y变成x就是左下的情况
- 隐藏特殊细节:左右上角的处理,对于右上角的位置,如果是右上的话,要先判断列再判断行,防止先行的话向右走就越界。 同理对称性,左下角也是
代码
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;
}
}
这篇博客介绍了如何按对角线顺序遍历一个m x n的矩阵。通过找规律、分类讨论和处理边界条件,结合对称性原理,解析了矩阵遍历的路径。文章详细阐述了右上和左下两种方向的遍历策略,并特别关注了边界和对称性的特殊情况。

1076

被折叠的 条评论
为什么被折叠?



