LC 对角线遍历

LC 对角线遍历

题目描述:

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

题目实例:

示例一:

在这里插入图片描述

输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]示例二:
输入:mat = [[1,2],[3,4]]
输出:[1,2,3,4]提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 104
1 <= m * n <= 104
-105 <= mat[i][j] <= 105

审题:

本题对空间复杂度无要求,我们可以申请额外的空间来解题。

标准思路:

仔细观察我们发现偶数对角线向上遍历,奇数列向下遍历,所以我们的代码就可以按照这个思路遍历。

(1)先得出遍历的次数,也就是对角线的条数为i=n+m-1,所以数组遍历条件也就是i<n+m-1。
(2)在看图,对角线上的每个元素坐标之和为i,也就是元素的坐标xy与i的关系为:x+y=i
(3)如何遍历?看图中,偶数对应的对角线上的元素是从下往上遍历,而奇数对应的对角线上的元素是从上往下遍历,那么只要确定遍历的起始点和结束点就好啦!我们先看偶数对角线的起点和终点,因为奇数对角线和它相反,知道了偶数的,也不难得出奇数的的。

当i<n-1时,起始点坐标x=i,如1的x坐标为0,i也为0,结束点的横坐标x=0
当i>=n-1时,起始点坐标x=n-1,如2的x坐标为2,i也为2,结束点的纵坐标y=m-1,根据(2)中的关系式,所以得出横坐标x=i-(m-1)
所以偶数对角线遍历时起始点的x的坐标为min(i,n-1),结束点的x坐标为max(0,i-(m-1)),而坐标y就是i-x

在这里插入图片描述

代码如下:

#include <vector>using namespace std;vector<int> findDiagonalOrder(vector<vector<int>>& mat) {// 初始化结果数组vector<int> result;// 获取矩阵的行数和列数int m = mat.size();if (m == 0) return result;  // 如果矩阵为空,则直接返回空数组int n = mat[0].size();// 对角线遍历for (int i = 0; i < m + n - 1; ++i) {if (i % 2 == 0) {  // 从左上到右下// 根据当前对角线的位置,确定遍历的起始点和结束点int startX = max(0, i - m + 1);int endX = min(i, n - 1);// 遍历当前对角线上的元素for (int x = startX; x <= endX; ++x) {result.push_back(mat[i - x][x]);}} else {  // 从右下到左上// 根据当前对角线的位置,确定遍历的起始点和结束点int startX = max(0, i - n + 1);int endX = min(i, m - 1);// 遍历当前对角线上的元素for (int x = startX; x <= endX; ++x) {result.push_back(mat[x][i - x]);}}}// 返回结果数组return result;
}
我的解题思路:

我一开始没有看出奇偶数对角线的特点,注意力全放在了如何遍历的方向上了,我发现遍历时只需要对矩阵边界上的数据做处理,矩阵内的数据只要按照上次遍历的方向走就行了,于是我定义了四个bool类型的变量flag来记录上一次遍历的方向,如果是边界上的数据就进行转弯,如果是矩阵内的数据就按照上一次的遍历方向进行就可以了;当然还需要对一些特殊矩阵做出特殊的处理。代码如下:

#include <iostream>
#include <vector>using namespace std;vector<int> findDiagonalOrder(vector<vector<int>> &mat)
{int row = mat.size();int columns = mat[0].size();int i = 0, j = 1, r = 1;vector<int> answer;bool lowerLeft = false, right = false, upperRight = false, down = false;answer.resize(row * columns);answer[0] = mat[0][0];right = true;if (row == 1 && columns == 1){return answer;}else if (row == 1 && columns != 1){for (; r < columns; ++r){answer[r] = mat[0][r];}return answer;}else if (row != 1 && columns == 1){for (; r < row; ++r){answer[r] = mat[r][0];}return answer;}while (i < row && j < columns){if (i == 0 && j == columns - 1 && upperRight){answer[r++] = mat[i][j];++i;down = true, upperRight = false;}else if (i == 0 && j == columns - 1 && right){answer[r++] = mat[i][j];++i, --j;lowerLeft = true, right = false;}else if (i == 0 && right){answer[r++] = mat[i][j];++i, --j;right = false, lowerLeft = true;}else if (i == 0 && upperRight){answer[r++] = mat[i][j];++j;upperRight = false, right = true;}else if (i == row - 1 && lowerLeft){answer[r++] = mat[i][j];++j;lowerLeft = false, right = true;}else if (i == row - 1 && right){answer[r++] = mat[i][j];--i, ++j;right = false, upperRight = true;}else if (j == 0 && lowerLeft){answer[r++] = mat[i][j];++i;lowerLeft = false, down = true;}else if (j == 0 && down){answer[r++] = mat[i][j];--i, ++j;down = false, upperRight = true;}else if (j == columns - 1 && right){answer[r++] = mat[i][j];++i, --j;right = false, lowerLeft = true;}else if (j == columns - 1 && upperRight){answer[r++] = mat[i][j];++i;upperRight = false, down = true;}else if (j == columns - 1 && down){answer[r++] = mat[i][j];++i, --j;down = false, lowerLeft = true;}else if (lowerLeft){answer[r++] = mat[i][j];++i, --j;}else{answer[r++] = mat[i][j];--i, ++j;}}return answer;
}int main(int argc, char *argv[])
{vector<vector<int>> myVector = {{1, 2, 3, 4, 5}};/*{{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13, 14, 15, 16}}{{1, 2, 3},{4, 5, 6},{7, 8, 9}}*/vector<int> answer;for (int i = 0; i < myVector.size(); ++i){for (int j = 0; j < myVector[0].size(); ++j){cout << myVector[i][j] << " ";}cout << endl;}answer = findDiagonalOrder(myVector);cout << endl;for (int i = 0; i < answer.size(); ++i){cout << answer[i] << " ";}cout << endl;return 0;
}
运行结果

在这里插入图片描述

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

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

相关文章

PaddleOCR封装,在线服务化部署实战(python部署,超新手教程)

OCR&#xff0c;即光学字符识别&#xff08;Optical Character Recognition&#xff09;&#xff0c;是一种将图像中的文字转换为机器编码文字的技术。这种技术可以识别和转换各种来源的文本&#xff0c;包括扫描文档、照片中的文字、手写笔记等。光学字符识别&#xff08;OCR&…

B站免费1080P清晰度

免费解锁B站1080P清晰度的视频 扫码登录后即可解锁1080P清晰度 复制想看视频的链接 登录成功后&#xff0c;把需要下载的链接粘贴到网站的搜索框中&#xff0c;点下搜索按钮&#xff0c;就能自动解析视频的下载地址。 有的链接可以直接解析出来 然后可以直接预览或者下载 …

【学习】focal loss 损失函数

focal loss用于解决正负样本的不均衡情况 通常我们需要预测的正样本要少于负样本&#xff0c;正负样本分布不均衡会带来什么影响&#xff1f;主要是两个方面。 样本不均衡的话&#xff0c;训练是低效不充分的。因为困难的正样本数量较少&#xff0c;大部分时间都在学习没有用…

Gradle构建项目报错Unable to start the daemon process

Unable to start the daemon process. This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized jvm option is used. 可能是配置的Java环境太高了&#xff0c;不支持&#xff0c;把java版本降到8就可以了。

Allegro如何导入芯片的Pin Delay?

Allegro在做等长时,需要导入芯片的Pin Delay才能做真正的等长。因为有些芯片内部的引脚本身就是不等长的,例如海思的部分芯片。 那么如何导入芯片的Pin Delay呢? 1、打开约束管理器,点击Properties(属性)→Component(器件)→Pin Properties→General。 在右栏找到芯片U1,…

Spring Boot 4.0:构建云原生Java应用的前沿工具

目录 前言 Spring Boot简介 Spring Boot 的新特性 1. 支持JDK 17 2. 集成云原生组件 3. 响应式编程支持 4. 更强大的安全性 5. 更简化的配置 Spring Boot 的应用场景 1. 云原生应用开发 2. 响应式应用程序 3. 安全性要求高的应用 4. JDK 17的应用 总结 作…

【C++进阶07】哈希表and哈希桶

一、哈希概念 顺序结构以及平衡树中 元素关键码与存储位置没有对应关系 因此查找一个元素 必须经过关键码的多次比较 顺序查找时间复杂度为O(N) 平衡树中为树的高度&#xff0c;即O( l o g 2 N log_2 N log2​N) 搜索效率 搜索过程中元素的比较次数 理想的搜索方法&#xff1a…

【UEFI基础】EDK网络框架(DNS4)

DNS4 DNS4协议说明 IP地址是一串数据&#xff0c;不便记忆。一般用户在使用TCP/IP协议进行通信时也不使用IP地址&#xff0c;而是使用英文和点号组成的字符串&#xff0c;两者的转换通过DNS&#xff08;Domain Name System&#xff09;来完成。 DNS也有v4和v6版本&#xff0…

如何将一个项目整体推送到gitee上以及如何在gitee上新建一个分支,并将一个项目全部推上去

1.如何将一个项目整体推送到gitee上 在Gitee上创建一个新的仓库&#xff0c;或者选择一个已有的仓库。 在本地的项目文件夹中打开终端或命令提示符窗口。 初始化Git仓库。在终端窗口中执行以下命令&#xff1a; git init将项目所有文件添加到Git的暂存区。执行以下命令&#…

枚举问题刷题

考研机试题目中的很多问题往往能通过暴力方法来求解&#xff0c;这些题目并不需要进行过多的思考&#xff0c;而只需枚举所有可能的情况&#xff0c;或者模拟题目中提出的规则&#xff0c;便可以得到解答。虽然说这种方法看上并不高明&#xff0c;但对于一些简单的题目来说却是…

c语言小游戏之扫雷

目录 一&#xff1a;游戏设计理念及思路 二&#xff1a;初步规划的游戏界面 三&#xff1a;开始扫雷游戏的实现 注&#xff1a;1.创建三个文件&#xff0c;test.c用来测试整个游戏的运行&#xff0c;game.c用来实现扫雷游戏的主体&#xff0c;game.h用来函数声明和包含头文…

计算一个4+3的结构变换问题

4a13 3a6 1 0 0 0 0 0 0 0 1 0 0 → ← 1 1 1 0 0 1 0 0 0 0 0 0 0 1 平面上有4个点由左向右运动&#xff0c;彼此之间保持4a13的结构&#xff0c;4个点既不在同一行&#xff0c;也不在同一列。还有3个点从右向左运动&#xff0c;保持3a6的结构&a…