498.对角线遍历

news2024/10/21 23:16:11

目录

  • 题目
  • 解法
      • 代码说明:
      • 输出:
  • 如何确定起始点?
    • 解释一下max(0,d−m+1)是什么意思?
  • 如何遍历对角线?
    • .push_back是怎么用的?

题目

给你一个大小为 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]

解法

你可以使用C++来实现对矩阵的对角线遍历,返回所有元素。对角线遍历的顺序可以分为两种情况:

  1. 从左下到右上(从低到高编号的对角线)。
  2. 从右上到左下(从高到低编号的对角线)。

以下是实现代码:

#include <iostream>
#include <vector>

using namespace std;

vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
    if (mat.empty() || mat[0].empty()) return {};
    
    int m = mat.size();
    int n = mat[0].size();
    vector<int> result;
    bool up = true;
    
    // 总共 m + n - 1 条对角线
    for (int d = 0; d < m + n - 1; ++d) {
        // 存储当前对角线上的元素
        vector<int> temp;
        
        // 确定对角线的起始点
        int r = up ? min(d, m - 1) : max(0, d - n + 1);
        int c = up ? max(0, d - m + 1) : min(d, n - 1);
        
        // 按照当前遍历方向进行遍历
        while (r >= 0 && r < m && c >= 0 && c < n) {
            temp.push_back(mat[r][c]);
            r += up ? -1 : 1;
            c += up ? 1 : -1;
        }
        
        
        // 将当前对角线的元素加入到结果数组中
        result.insert(result.end(), temp.begin(), temp.end());
        
        // 切换方向
        up = !up;
    }
    
    return result;
}

int main() {
    vector<vector<int>> mat = {
        { 1, 2, 3 },
        { 4, 5, 6 },
        { 7, 8, 9 }
    };
    
    vector<int> result = findDiagonalOrder(mat);
    
    for (int num : result) {
        cout << num << " ";
    }
    
    return 0;
}

代码说明:

  1. findDiagonalOrder 函数接受一个矩阵 mat,输出按对角线遍历顺序排列的元素数组。
  2. up 变量用于跟踪当前遍历方向(从左下到右上或从右上到左下)。
  3. 外层循环控制遍历的对角线数,总共有 m + n - 1 条对角线。
  4. 内层循环遍历每一条对角线上的元素,将其存储到 temp 中。如果当前是从左下到右上的遍历方向,需要将 temp 反转后再加入到结果中。

输出:

对于输入矩阵:

{
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
}

程序的输出将是:

1 2 4 7 5 3 6 8 9

这样就实现了对矩阵的对角线遍历。

如何确定起始点?

确定对角线遍历的起始点可以通过当前遍历的对角线编号 ( d ) 来决定。我们需要根据 ( d ) 是较小的还是较大的情况来选择矩阵中的起始行和起始列。下面我通过具体例子来说明如何确定起始点。

矩阵的大小为 ( m = 3 ) 行,( n = 3 ) 列,总共需要遍历的对角线数是 ( m + n - 1 = 5 ) 条。

第 0 条对角线:( d = 0 )

  • 方向:从左下到右上(up = true)
  • 起始点
    • 行 ( r = \min(d, m-1) = \min(0, 2) = 0 )
    • 列 ( c = \max(0, d - m + 1) = \max(0, 0 - 3 + 1) = 0 )
  • 遍历顺序:从 ( mat[0][0] ) 开始,即 ( 1 )。

第 1 条对角线:( d = 1 )

  • 方向:从右上到左下(up = false)
  • 起始点
    • 行 ( r = \max(0, d - n + 1) = \max(0, 1 - 3 + 1) = 0 )
    • 列 ( c = \min(d, n-1) = \min(1, 2) = 1 )
  • 遍历顺序:从 ( mat[0][1] ) 开始,沿对角线遍历 ( 2, 4 )。

第 2 条对角线:( d = 2 )

  • 方向:从左下到右上(up = true)
  • 起始点
    • 行 ( r = \min(d, m-1) = \min(2, 2) = 2 )
    • 列 ( c = \max(0, d - m + 1) = \max(0, 2 - 3 + 1) = 0 )
  • 遍历顺序:从 ( mat[2][0] ) 开始,沿对角线遍历 ( 7, 5, 3 )。

通过这样的规则,可以确定每一条对角线的起始点,并根据遍历方向处理对角线上的元素。

解释一下max(0,d−m+1)是什么意思?

起始点,既然是个点既要有行的位置,也需要列的位置
max(0, d - m + 1) 是确定对角线遍历起始点(列号 c)的关键表达式之一,它用来计算当前对角线的列起始位置。为了更好地理解它的作用,我们可以逐步拆解这个公式,并结合矩阵的形状和遍历情况进行解释。

如何遍历对角线?

先分情况获取起始点,随后按平移方法依次获取对角线上的元素

 temp.push_back(mat[r][c]);
            r += up ? -1 : 1;
            c += up ? 1 : -1;

.push_back是怎么用的?

push_back 是 C++ 中 std::vector 容器的一个成员函数,用来在 vector 的末尾添加一个元素。它是动态数组操作中最常用的函数之一,能够方便地向容器中追加新元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JNA调用c++动态库返回数据

jna学习网站 JNA Examples 1、返回String, pch.h头文件 // pch.h: 这是预编译标头文件。 // 下方列出的文件仅编译一次&#xff0c;提高了将来生成的生成性能。 // 这还将影响 IntelliSense 性能&#xff0c;包括代码完成和许多代码浏览功能。 // 但是&#xff0c;如果此处…

软考攻略/超详细/系统集成项目管理工程师/基础知识分享18

6.5数据分析及应用 6.5.1 数据集成&#xff08;掌握&#xff09; 数据集成就是将驻留在不同数据源中的数据进行整合&#xff0c;向用户提供统一的数据视图&#xff0c;使得用户能以透明的方式访问数据。 WebServices技术是一个面向访问的分布式计算模型&#xff0c;它的本质是…

Nature 正刊丨空间蛋白质组学确定JAKi是一种致命皮肤病的治疗方法

01摘要 中毒性表皮坏死松解症&#xff08;TEN&#xff09;是一种由常见药物引发的致命药物性皮肤反应&#xff0c;是一个新出现的公共卫生问题1,2,3。TEN患者会因角质形成细胞死亡而发生严重和突然的表皮脱离。尽管已经提出了驱动角质形成细胞死亡的分子机制&#xff0c;但主要…

10.21 IO进程直接的通信

1、用消息队列实现两个进程直接的通信 先输入的代码 #include<myhead.h> //定义消息列队的结构体 struct msgbuf {long mtype; //消息类型char mtext[1024]; //消息正文 };//宏定义正文的大小 #define MSGSZ (sizeof(struct msgbuf) - sizeof(long))//定义回收僵尸信号…

Linux第一讲:Linux基本指令

Linux第一讲&#xff1a;Linux基本指令 1.Linux发展历史2.先快速了解一些指令3.指令 -- ls3.1知识点1 -- 文件属性3.1.1详细解析ls指令3.1.1.1 ls3.1.1.2 ls -l 、ls -a3.1.1.2.1 ls -l3.1.1.2.2 ls -a3.1.1.2.3 ls -la 3.1.1.3其它指令 3.2知识点2 -- 什么是.和..3.3知识点3 -…

手写模拟Spring的基本功能

文章目录 1. Spring的基本功能2. 容器启动 容器启动&#xff0c;即创建容器对象并赋予配置对象3. BeanDefinition扫描4. Bean的生命周期5. 单例Bean与多例Bean6. 依赖注入7. AOP8. Aware 回调9. 初始化10. BeanPostProcessor附录&#xff1a; 1. Spring的基本功能 2. 容器启动 …

【鸡翅Club】项目启动

一、项目背景 这是一个 C端的社区项目&#xff0c;有博客、交流&#xff0c;面试学习&#xff0c;练题等模块。 项目的背景主要是我们想要通过面试题的分类&#xff0c;难度&#xff0c;打标&#xff0c;来评估员工的技术能力。同时在我们公司招聘季的时候&#xff0c;极大的…

mingw64的Windows安装及配置教程gcc、g++等

mingw64.rar 链接&#xff1a;https://pan.baidu.com/s/18YrDRyi5NHtqnTwhJG6PuA 提取码&#xff1a;pbli &#xff08;免费永久有效&#xff0c;免安装&#xff0c;解压后配置环境变量即可使用&#xff09; 1 下载 解压后随便放到一个地方&#xff1a; 复制“bin”路径&am…

SpringCloudAlibaba[Nacos]注册配置中心注册与发现服务

Nacos的全称是Dynamic Naming and Configuration Service&#xff0c;Na为naming/nameServer即注册中心,co为configuration即注册中心&#xff0c;service是指该注册/配置中心都是以服务为核心。是阿里巴巴开源易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nac…

安装vue发生异常:npm ERR! the command again as root/Administrator.

一、异常 npm ERR! The operation was rejected by your operating system. npm ERR! Its possible that the file was already in use (by a text editor or antivirus), npm ERR! or that you lack permissions to access it. npm ERR! npm ERR! If you believe this might b…

【LeetCode:910. 最小差值 II + 模拟 + 思维】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

html,css,js实现Upload 上传

实现效果&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Docum…

基于Multisim的汽车尾灯控制电路设计与仿真

假设汽车尾部左右量测各有3个指示灯&#xff08;用发光二极管模拟&#xff09;1. 汽车正常运行时指示灯全灭&#xff1b;2.右转弯时&#xff0c;右侧3个指示灯按右循环顺序点亮&#xff1b;.3. 左转弯时&#xff0c;左侧3个指示灯按左循环顺序点亮&#xff1b;4.临时刹车时所有…

【C语言刷力扣】910.最小差值 ||

题目&#xff1a; 解题思路; 由于需要对数组中的每一个进行 k 或 -k 的操作&#xff0c;这时要求最小差值&#xff0c;即对较大的数 -k 对较小的数 k。 需要先对数组进行排序&#xff0c;再枚举对元素的操作。 对 nums[0] 到 nums[i - 1] 的数进行 k对 nums[i] 到 nums[numsS…

Java笔试05

在Java中&#xff0c;final 关键字可以用于修饰类、方法和变量&#xff1a; 修饰类&#xff1a; 被 final 修饰的类不能被继承&#xff0c;即不能有子类。这通常用于工具类或者不希望被扩展的类。 修饰方法&#xff1a; 被 final 修饰的方法不能被子类覆盖。这通常用于确保类…

Yolo目标检测:实时性与准确性的完美结合

在目标检测领域&#xff0c;Yolo&#xff08;You Only Look Once&#xff09;算法无疑是一颗璀璨的明星。自2016年由Joseph Redmon等人提出以来&#xff0c;Yolo凭借其出色的实时性和准确性&#xff0c;迅速在多个应用场景中崭露头角。本文将详细介绍Yolo目标检测的基本原理、优…

Qt学习笔记第21到30讲

第21讲 new/delete关键字 new关键字 在 C 中&#xff0c; new 关键字用于动态分配内存。它是 C 中处理动态内存分配的主要工具之一&#xff0c;允许在程序运行时根据需要分配内存。 用法 ①分配单个对象&#xff1a;使用 new 可以在堆上动态分配一个对象。例如&#xf…

面向对象进阶(上)(JAVA笔记第二十二期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 static修饰符静态变量静态方法 工具类工具类的使用例子第一题第二题 static注意事项继承关系建立继承关系的格式继承的好处及使用场景继承的特点继承体系的设计继承中类的三大要素…

JavaWeb 22.Node.js_简介和安装

有时候&#xff0c;后退原来是向前 —— 24.10.7 一、什么是Node.js Node.js 是一个于 Chrome V8 的 JavaScript 运行时环境&#xff0c;可以使 JavaScript 运行在服务器端。使用 Node.js&#xff0c;可以方便地开发服务器端应用程序&#xff0c;如 Web 应用、API、后端服务&a…

使用Three.js和Force-Directed Graph实现3D知识图谱可视化

先看样式&#xff1a; 在当今信息爆炸的时代&#xff0c;如何有效地组织和展示复杂的知识结构成为一个重要的挑战。3D知识图谱可视化是一种直观、交互性强的方式来呈现知识之间的关系。本文将详细介绍如何使用HTML、JavaScript、Three.js和Force-Directed Graph库来实现一个交互…