对角线遍历

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

说在前面

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

问题描述

给你一个大小为 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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
人工智能 安全 API
如何在数字世界复刻一个高还原、高拟真的“你”
通过阿里云智能媒体服务IMS完成数字人形象训练、人声克隆定制,并使用Timeline实现视频合成及创作,打造一个“声形俱佳”的数字分身。
675 0
|
5月前
|
人工智能 运维 搜索推荐
2025年度数字人平台推荐榜单揭晓:实力、优势、功能、应用场景、技术等报告呈现
根据2025年最新行业数据及权威榜单分析,国内数字人领域已形成以技术驱动、场景落地为核心的竞争格局,以下推荐5家头部企业及特色厂商,按技术成熟度、场景适配性、行业影响力综合排序:
|
数据库
Activiti进阶篇-组任务
Activiti进阶篇-组任务
Activiti进阶篇-组任务
|
编解码 Linux vr&ar
如何使用ffmpeg将.m4a 格式转换为 pcma格式
ffmpeg是一款开源的万能媒体格式转换工具。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的
|
分布式计算 监控 Java
Java的大数据处理与分析技术 (2)
Java的大数据处理与分析技术 (2)
320 2
|
存储 关系型数据库 MySQL
MySQL的MyISAM引擎:技术特点与应用场景
【4月更文挑战第20天】MySQL的MyISAM引擎特点是表级锁定,适合读多写少的场景,不支持事务但提供全文索引,适用于只读应用、全文搜索和简单备份恢复。在选择存储引擎时,应根据具体需求权衡。
1452 11
|
机器学习/深度学习 算法
基于LSTM的负荷和可再生能源出力预测(核心部分复现)
基于LSTM的负荷和可再生能源出力预测(核心部分复现)
|
机器学习/深度学习 搜索推荐 算法
直接调用通用大模型开发应用与基于开源大模型“自研”两种方式比较
【1月更文挑战第23天】直接调用通用大模型开发应用与基于开源大模型“自研”两种方式比较
788 1
直接调用通用大模型开发应用与基于开源大模型“自研”两种方式比较
|
缓存 Linux 测试技术
搭建本地YUM仓库
在Redhat 9系统中,通过挂载系统安装盘到/mnt,然后创建本地YUM仓库以实现软件包管理。首先查看磁盘挂载情况,将ISO镜像挂载到/mnt。接着,备份`/etc/yum.repos.d/`目录内容,删除原有仓库,创建`loaclhost.repo`文件并配置指向/mnt中的Package目录。运行`yum clean all`清除缓存,`yum makecache`建立元数据。最后,成功通过新配置的本地仓库安装了bind软件及其依赖。
836 3
|
缓存 JavaScript
Vue 中的 computed 和 watch 的区别
Vue 中的 computed 和 watch 的区别
329 0

热门文章

最新文章