498.对角线遍历

目录

  • 题目
  • 解法
      • 代码说明:
      • 输出:
  • 如何确定起始点?
    • 解释一下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.rhkb.cn/news/453347.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java知识巩固(七)

目录 面向对象 面向对象三大特征 封装 继承 多态 多态 深拷贝和浅拷贝区别了解吗?什么是引用拷贝? 浅拷贝 深拷贝 面向对象 万物皆为对象&#xff0c;也就是描述某个事物解决问题的过程中所发生的事情。 面向对象三大特征 封装 封装是指把一个对象的状态信息&…

目前最新 Reflector V11.1.0.2067版本 .NET 反编译软件

目前最新 Reflector V11.1.0.2067版本 .NET 反编译软件 一、简介二、.NET Reflector的主要功能包括&#xff1a;1. **反编译**: 反编译是将已编译的.NET程序集&#xff08;如.dll或.exe文件&#xff09;转换回可读的源代码。这使得开发者可以查看和学习第三方库的实现细节&…

C++ string(2)

文章目录 1.初识迭代器和范围for1.1迭代器1.2范围for1.3 aout关键字 2.字符串长度相关计算1.size 和 length2. capacity 和 reserve 3.例题演示1. [917. 仅仅反转字母 - 力扣&#xff08;LeetCode&#xff09;](https://leetcode.cn/problems/reverse-only-letters/description…

spring day 1021

ok了家人们&#xff0c;这周学习spring框架&#xff0c;我们一起去看看吧 Spring 一.Spring概述 1.1 Spring介绍 官网&#xff1a; https://spring.io/ 广义的 Spring &#xff1a; Spring 技术栈 &#xff08;全家桶&#xff09; 广义上的 Spring 泛指以 Spring Framework…

Spring AI 整体介绍_关键组件快速入门_prompt_embedding等

Spring AI&#xff1a;Java开发者的AI集成新利器 在过去&#xff0c;Java开发者在构建AI应用时面临着缺乏统一框架的问题&#xff0c;导致不同AI服务的集成过程复杂且耗时。Spring AI应运而生&#xff0c;旨在为基于Java的应用程序提供一个标准化、高效且易于使用的AI开发平台…

浅说差分算法(下)

我们上节课学了一维的差分&#xff0c;但其实还有二维差分&#xff0c;只是比较难写。 差分 二维差分的定义 二维差分是指对于一个n*m的矩阵a&#xff0c;要求支持操作pro(x1,y1,x2,y2,a)&#xff0c;表示对于以(x1,y1)为左上角&#xff0c;(x2,y2)为右下角的矩形区域&#…

生产车间质量管理有什么用?怎么做?

在生产车间的质量管理中&#xff0c;科学有效的管理方法和严格规范的执行流程是至关重要的&#xff0c;它能够帮助企业提高产品质量、降低次品率、确保生产过程的稳定性和效率。然而&#xff0c;许多企业在生产车间质量管理方面存在诸多问题&#xff0c;常常会面临以下困境&…

多微批量自动加好友

在数字化时代&#xff0c;微信不仅是社交通讯的工具&#xff0c;更是一个拥有庞大用户基础的流量平台。对于企业而言&#xff0c;微信是打造私域流量池的理想选择之一。然而&#xff0c;随着微信号的增多&#xff0c;手动添加好友和备注变得既繁琐又耗时。幸运的是&#xff0c;…

UNI VFX Missiles Explosions for Visual Effect Graph

Unity URP和HDRP的通用视觉效果 使用在视觉效果图中制作的高性能GPU粒子系统。 无需进入视觉效果图编辑器即可轻松自定义VFX。 使用(VFX)事件——一个游戏对象可存储多个效果,这些效果可通过C#或视觉脚本触发。 总共32个事件(不包括“停止”事件)。 ❓ 什么是(VFX)事件?…

Cpp::STL—容器适配器Stack和Queue的讲解和模拟实现(15)

文章目录 前言一、适配器模式概念分类 二、Stack核心作用代码实现 三、Queue核心作用代码实现 四、deque双端队列貌似兼收并蓄&#xff1f;实则也难以兼得~ 总结 前言 适配器也是STL六大组件之一&#xff0c;请跟我一起领悟它的智慧&#xff01;   正文开始&#xff01; 一、…

consumer 角度讲一下i2c外设

往期内容 I2C子系统专栏&#xff1a; I2C&#xff08;IIC&#xff09;协议讲解-CSDN博客SMBus 协议详解-CSDN博客I2C相关结构体讲解:i2c_adapter、i2c_algorithm、i2c_msg-CSDN博客内核提供的通用I2C设备驱动I2c-dev.c分析&#xff1a;注册篇内核提供的通用I2C设备驱动I2C-dev.…

浅析建造者模式

建造者模式 一、基础知识介绍 1. 问题引出 上图面存在的问题&#xff1a;产品和产品创建的过程是封装在一起的。耦合性太强 解决方法: 将二者解耦和 2.建造者模式介绍 将复杂对象的构造过程抽象出来&#xff0c;用户不用知晓里面的构建细节 3.四个角色 建造者模式的四个角…

Java项目-基于springboot框架的财务管理系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

【element-tiptap】如何修改选中内容时的背景颜色?

前言&#xff1a;element-tiptap 用鼠标选中内容的时候&#xff0c;背景颜色跟系统设置的主题有关&#xff0c;比如的我的就是卡哇伊的pink&#xff0c;默认是淡蓝色 但是我们观察一下语雀&#xff0c;背景颜色是它规定好的颜色 这篇文章来探索一下&#xff0c;怎么自己规定选…

实操上手TinyEngine低代码引擎插件化开发

1.背景介绍 1.1 TinyEngine 低代码引擎简介 低代码开发是近些年非常热门的一种开发方式&#xff0c;用户可以通过可视化的方式&#xff0c;简单拖拽&#xff0c;不写代码或者编写少量代码&#xff0c;类似搭积木一样搭建业务应用。 TinyEngine是一个强大的低代码引擎&#x…

企业博客SEO优化:8个必备工具与资源指南

在当今数字化时代&#xff0c;企业博客已远远超越了传统意义上的信息展示平台。它不仅是企业展示品牌形象、传递品牌价值的重要窗口&#xff0c;更是吸引潜在客户、增强用户粘性、提升网站流量和搜索引擎排名的关键。通过精心策划和高质量的内容创作&#xff0c;企业博客能够建…

ChatGPT4o、o1 谁才是最佳大模型?

如何选择合适的 ChatGPT 模型&#xff1f;OpenAI 更新细节与 GPTs 的深入解析 随着人工智能的发展&#xff0c;ChatGPT 已成为众多用户的强大助手&#xff0c;广泛应用于写作、编程、学习和商业等多个领域。然而&#xff0c;面对 OpenAI 提供的众多模型&#xff08;如 GPT-4、…

idea中,git提交时忽略某些本地修改.将文件从git暂存区移除

我们有时候在本地调试代码时&#xff0c;某些配置文件需要修改成本地环境中。当改完后&#xff0c;需要提交代码时&#xff0c;这些文件又不能推到git上。如下图&#xff1a; 当出现这种情况&#xff0c;我们每次都需要手动去将不需要提交的文件的对号去掉。文件多了后&#x…

[Redis] 在Linux中安装Redis并连接图形化工具详细过程(附下载链接)

前言 安装Redis之前应该在虚拟机中安装Linux系统&#xff0c;这里使用centos7版本 [linux] 在VMware中安装linux、文件下载及详细安装过程&#xff08;附下载链接&#xff09;-CSDN博客 安装Linux后&#xff0c;更换yum源为阿里云并安装gcc依赖 [Linux] CentOS7替换yum源为阿…

Rust 语言持续崛起,即将冲击 TIOBE 指数前十,能否成为编程语言新王者?

Rust 语言持续崛起&#xff0c;即将冲击 TIOBE 指数前十&#xff0c;能否成为编程语言新王者&#xff1f; 2024 年 10 月&#xff0c;全球编程语言 TIOBE 排行榜再次更新&#xff0c;各大编程语言在各自领域中继续发挥着独特的优势。官方的标题是&#xff1a; Rust排名稳步攀升…