对角线遍历

简介: 🎈每天进行一道算法题目练习,今天的题目是“对角线遍历”

说在前面

🎈每天进行一道算法题目练习,今天的题目是“对角线遍历”。

问题描述

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

示例 1:

image.png

输入: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

思路分析

题目的描述很简单,要求也很简单,就是给定一个 m * n 的矩阵,要我们输出按对角线遍历的结果,遍历的规则如示例1所示,从左上角出发,先向右上遍历,再向左下遍历,交替遍历直到遍历完所有元素,读完题目后我们知道了题目要求,接下来就是要根据规律来输入结果。

image.png

如图所示,图中是一个 8 * 7 的矩阵,我们可以看到其中对角线的数量为14条,这数量与m和n之间有什么关联吗?我们可以继续看下图:

image.png

通过上图我们可以看出每一条对角线都会经过左边和下边方块的左下顶点,所以我们只需要计算这两边的左下顶点数即可得出矩阵的对角线数量为:m + n - 1,而且对角线的方向是交叉的,如上图,我们可以从左往右给每条对角线排个序,我们可以发现序号是奇数时的对角线的方向为从左下到右上,偶数时则相反,方向为由右上到左下。确定方向后我们还需要知道对角线的起点和终点,观察上图我们可以发现:

  • 1、对角线序号为奇数

奇数时对角线的起始点应该在左边或者下边
(1)起始点在左边时
起始点在左边时,起始点的行数与序号相等,列数为0;
(2)起始点在下边时
起始点在下边时,起始点的行数为m,列数为序号减去m。

  • 2、对角线序号为偶数

奇数时对角线的起始点应该在上边或者右边
(1)起始点在上边时
起始点在左边时,起始点的行数为0,列数与序号相等;
(2)起始点在下边时
起始点在下边时,起始点的行数为序号减去n,列数为n。

确定了起点之后我们可以开始获取对角线上的每一个点:

  • 1、对角线序号为奇数

对角线序号为奇数,即其对角线方向为左下到右上,对角线上的点应该满足以下规律

p[i] = mat[x][y];
p[i - 1] = mat[x+1][y-1];
  • 2、对角线序号为偶数

对角线序号为偶数,即其对角线方向为右上到左下,对角线上的点应该满足以下规律

p[i] = mat[x][y];
p[i - 1] = mat[x-1][y+1];

AC代码

/**
 * @param {number[][]} mat
 * @return {number[]}
 */
 var findDiagonalOrder = function(mat) {
    let res = [];
    const m = mat.length,n = mat[0].length;
    for(let i = 0; i < m + n - 1; i++){
        if(i % 2 == 0){
            let x = i < m ? i : m - 1;
            let y = i < m ? 0 : i - m + 1;
            while (x >= 0 && y < n) {
                res.push(mat[x--][y++]);
            }
        }else {
            let x = i < n ? 0 : i - n + 1;
            let y = i < n ? i : n - 1;
            while (x < m && y >= 0) {
                res.push(mat[x++][y--]);
            }
        }
    }
    return res;
};

说在后面

🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
缓存 负载均衡 网络协议
面试题22解析-CDN分析
题目:描述一下CDN的工作机制?
1575 0
|
消息中间件 Java 关系型数据库
10道不得不会的Docker面试题
10道不得不会的Docker面试题,10道不得不会的Docker面试题
9678 1
10道不得不会的Docker面试题
|
12月前
|
人工智能 机器人 芯片
《C++与类脑芯片:开启人工智能硬件新征程》
在人工智能快速发展的背景下,类脑芯片作为模仿人类大脑神经元结构的新型硬件,以其低功耗和高并行处理能力崭露头角。C++凭借其高效执行、强大内存管理和丰富的库支持,在类脑芯片的应用开发中展现出独特优势。二者结合不仅在智能感知、数据处理和机器人控制等领域带来突破,还为未来创新应用如智能诊断、个性化教育等开辟了广阔前景。尽管面临编程复杂性和生态不完善等挑战,但通过学术界、产业界和开源社区的合作,C++与类脑芯片有望推动人工智能迈向新高度。
323 12
|
存储 算法 C++
c++string容器-字符串比较讲解
c++string容器-字符串比较讲解
904 1
|
Java Spring
JWT token验证后,通过 ThreadLocal 进行传值
JWT token验证后,通过 ThreadLocal 进行传值
210 0
|
监控 网络协议 Java
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
327 0
vscode 如何修改c/c++格式化风格,大括号不换行
vscode 如何修改c/c++格式化风格,大括号不换行
|
存储 Ubuntu 物联网
玩转百问网东山Pi壹号-SSD202 Linux开发板(一)
玩转百问网东山Pi壹号-SSD202 Linux开发板(一)
669 0
|
存储 弹性计算 安全
阿里云服务器ECS产品知识及购买和使用常见问题及答案汇总
本文总结了阿里云用户在购买和使用阿里云服务器中的一些常见的问题,包括什么是云服务器ECS,特性与优势,应用场景,基本概念,使用限制等众多问题,适合新手用户全方位了解阿里云服务器,并根据自己的需求选择自己满意的云服务器。
阿里云服务器ECS产品知识及购买和使用常见问题及答案汇总
|
算法 Java
数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!
数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!
6660 1