用对角线去遍历矩阵

声明

该系列文章仅仅展示个人的解题思路和分析过程,并非一定是优质题解,重要的是通过分析和解决问题能让我们逐渐熟练和成长,从新手到大佬离不开一个磨练的过程,加油!

原题链接

用对角线遍历矩阵https://leetcode.cn/leetbook/read/array-and-string/cuxq3/

算法分析
图一

图二

图三
图四

       

由上述四个图可以总结得出以下八个结论: 

结论1:k属于[0,a(max)+b(max)]。

结论2:每一层遍历行最多存在min(m,n)个矩阵索引对,min(m,n)表示m和n二者中小的那一个值。

结论3:a属于[0,m-1],b属于[0,n-1]。

结论4:若k为偶数则以a为比较对象,此时若k<=a(max)则当前遍历行的起始索引对为(k,0),反之则起始索引对为(a(max),k-a(max))。

结论5:若k为奇数则以b为比较对象,此时若k<=b(max)则当前遍历行的起始索引对位(0,k),反之则起始索引对为(k-b(max),b(max))。

结论6:从当前遍历行的起始索引对开始,若k为偶数,则下一个索引对为(a-1,b+1),反之下一个索引对为(a+1,b-1)。

结论7:遍历行的结束条件由该矩阵的遍历行最大索引对个数和a(min)、b(min)共同决定,首先应判断当前遍历行访问的矩阵索引对个数是否达到了该矩阵的遍历行最大索引对个数,若达到了则完成该遍历行的遍历,否则判断下一个索引对(a,b),若a或b越界则表明完成该遍历行的遍历。

结论8:整个矩阵遍历结束的条件是当前遍历的矩阵索引对的个数是m×n个。

 代码示例(C#)
public int[] FindDiagonalOrder(int[][] mat)
{int m = mat.Length;//矩阵的行数int n = mat[0].Length;//矩阵的列数int[] result = new int[m * n];//结果数组//a:索引对的a,b:索引对的b,k:a+b,count:当前已遍历的矩阵索引对个数,minA:a的最小值//minB:b的最小值,index:结果数组中的索引指针int a, b, k = 0, count = 0, minA = 0, minB = 0, index = 0;int maxA = m - 1;//a的最大值int maxB = n - 1;//b的最大值int maxIndexsCount = m <= n ? m : n;//该矩阵中遍历行的矩阵索引对个数的最大值int lineIndexsCount;//遍历行当前已遍历的矩阵索引对个数while (count < m * n){lineIndexsCount = 0;//若k%2为0则表示k为偶数,反之则为奇数if (k % 2 == 0){if (k <= maxA){a = k;b = 0;}else{a = maxA;b = k - maxA;}}else{if (k <= maxB){a = 0;b = k;}else{a = k - maxB;b = maxB;}}while (lineIndexsCount < maxIndexsCount){//a或b越界则完成此次遍历行的遍历if ((a < minA || a > maxA) || (b < minB || b > maxB)) break;//记录结果result[index++] = mat[a][b];count++;if (k % 2 == 0){a--;b++;}else{a++;b--;}}k++;}return result;
}
算法解说 

        按照原题的思路我们列举出了四种矩阵,严格来说只有三种,分别是矩阵行数大于列数、行数等于列数、行数小于列数,而为了保证后续结论的真实性,我们列举了两个行数等于列数的矩阵。

        图中我们完成了四个矩阵的制定,然后按照题目要求去遍历了四个矩阵并且将遍历的结果记录下来,从行列定义上我们可以将矩阵构建在二维平面中,从而为每一个元素设立一个唯一的坐标值,在本题中我们把这个坐标值称为索引对。有了索引对我们可以进一步按照索引对两个数值之和对遍历结果进行分组,在本题中我们把索引对两个数值之和相同的一组索引对称为遍历行,为了简便后续将索引对两个数值之和称为索引对结果值。

        将遍历行按照索引对结果值从小到大的顺序进行排列,为了能够发现更多有用的结论,我们把每一层遍历行的索引对结果值、结果值的奇偶性、索引对与k值的关系列举出来,除此之外还需要列举出矩阵行列数以及索引对两个数值的取值范围,至于为什么要去列举这些东西,实际上还是通过尝试和思考,就像上学时做数学题,浏览题目之后列举出题目中给定的条件,然后根据条件去解题。

        这一步我们可以理解为进一步细化和剖析已知条件,我们的目的是从已知条件中获取可靠的结论,从而根据结论解决问题,因此我们总结出了上文的八个结论。

        那么已知结论后如何去编写代码呢?本人是按照以下几个问题去解决的。

        1.我们需要明白输入和输出是什么?

        2.我们需要定义哪些变量?

        3.函数主体是什么?

        4.某些过程的结束条件是什么?

        实际上,就是将我们的八个结论构建为代码,简单划分就是定义变量和逻辑主体,定义变量就看结论中需要记录数据的描述,逻辑主体就看结论中对于逻辑处理、结束条件的描述。

        当然这样转换出来的代码比较粗糙,所以后续还可以结合自己的编程知识再去优化自己的代码,让它变得更加简洁精致。

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

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

相关文章

数据结构——栈(C语言)

需求&#xff1a;无 栈的概念&#xff1a; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端为栈底。栈中的数据元素遵守后进先出&#xff08;LIFO&#xff09;原则。压栈&…

自动驾驶——驶向未来的革命性技术

自动驾驶——驶向未来的革命性技术 自动驾驶的组件自动驾驶的优势自动驾驶的应用自动驾驶的未来中国的自动驾驶 自动驾驶是一种技术&#xff0c;它允许车辆在没有人类驾驶员的情况下自主地进行行驶。它利用各种传感器、计算机视觉、人工智能和机器学习算法来感知和理解周围环境…

.net连接mysql,提示找不到请求的 .Net Framework Data Provider。可能没有安装

开发完成的.net程序需要连接mysql数据库&#xff0c;在个人电脑上运行没问题&#xff0c;别人运行时提示“提示找不到请求的 .Net Framework Data Provider。可能没有安装”。经过查询&#xff0c;安装Connector/NET 8.1.0&#xff0c;下载地址如下所示&#xff1a; https://d…

使用腾讯云轻量服务器Matomo应用模板建网站流量统计系统

腾讯云百科分享使用腾讯云轻量应用服务器Matomo应用模板搭建网站流量统计系统&#xff0c;Matomo 是一款开源的网站数据统计软件&#xff0c;可以用于跟踪、分析您的网站的流量&#xff0c;同时充分保障数据安全性、隐私性。该镜像基于 CentOS 7.6 64位操作系统&#xff0c;已预…

06-加密算法

加密算法 一、前言知识1、加密解密2、MD5&#xff08;最常见&#xff09;3、SHA4、进制5、时间戳6、URL编码7、base64编码8、unescape编码9、AES加密10、DES&#xff08;类似于base64&#xff09; 二、常见加密形式算法解析三、演示案例1、某 CTF 比赛题目解析2、某 CMS 密码加…

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 参数化&#xff1…

spring框架,以及和spring框架相关的Java面试题和spring ioc的注入方式

目录 一.spring来源&#xff0c;以及介绍 1.spring诞生的背景 2.spring框架 介绍 3.spring框架在使用中的优点以及不足 3.1优点 3.2不足 3.3总结 4.为什么要使用spring 二.将spring框架部署在IDEA中 1.替换pom.xml 2.构建spring所需要的xml文件 三.spring的三种注入…

网络通信原理IP头部格式(第四十二课)

字段作用解析:1)版本: 指的IP地址的版本 (IPv4 或 IPV6)2)首部长度: 次数据包的首部长度一共是多少,没有加可选项3)优先级与服务类型:表示****数据包是否需要优选传递4)总长度: 表示的是整个数据包的大小,也就****是首部+数据5)标识符、标志、段偏移量:的作用将拆开的…

无涯教程-Perl - syswrite函数

描述 此函数尝试将SCALAR中的LENGTH个字节写入与FILEHANDLE相关的文件。如果指定了OFFSET,则从提供的SCALAR中的OFFSET字节中读取信息。该函数使用C /操作系统的write()函数,该函数绕过普通缓冲。 语法 以下是此函数的简单语法- syswrite FILEHANDLE, SCALAR, LENGTH, OFFS…

draw.io导出矢量图到word报错text is not svg - cannot display

先参考https://blog.csdn.net/a625750076/article/details/126384831 如果不行&#xff0c;可能是转存的问题 解决方法&#xff1a;直接在draw.io上操作 第一步 第二步 然后再word中粘贴&#xff0c;依旧是矢量图哦&#xff01;

Ajax入门+aixos+HTTP协议

一.Ajax入门 概念:AJAX是浏览器与服务器进行数据通信的技术 axios使用: 引入axios.js使用axios函数:传入配置对象,再用.then回调函数接受结果,并做后续处理 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>01.axios使用…

获取excel中的图片(包含wps中嵌入单元格图片)

项目中有excel导入功能,并且需要导入excel中的图片;模板如图: 已知office中插入的图片为浮动形式;如图: wps中可以插入浮动图片,也可以插入嵌入单元格图片;如图: 并且在wps嵌入单元格形式的图片可以看到使用的是公式;如图: 问题来了,如何获取图片 并且将图片与单元格进行对应 …

Cat(3):客户端集成—简单案例

接下来编写一个简单的springboot与Cat整合的案例 1 新建springboot项目 首先创建一个Spring Boot的初始化工程。只需要勾选web依赖即可。 2 添加 Maven 添加依赖 <dependency><groupId>com.dianping.cat</groupId><artifactId>cat-client</artifa…

UE4/5Niagara粒子特效学习(使用UE5.1,适合新手)

目录 创建空模板 创建粒子 粒子的基础属性 粒子的生命周期 颜色 大小设置 生成的位置 Skeletal Mesh Location的效果&#xff1a; Shape Location 添加速度 添加Noise力场 在生成中添加&#xff1a; 效果&#xff1a; ​编辑 在更新中添加&#xff1a; 效果&…

机器学习线性代数基础

本文是斯坦福大学CS 229机器学习课程的基础材料&#xff0c;原始文件下载 原文作者&#xff1a;Zico Kolter&#xff0c;修改&#xff1a;Chuong Do&#xff0c; Tengyu Ma 翻译&#xff1a;黄海广 备注&#xff1a;请关注github的更新&#xff0c;线性代数和概率论已经更新完毕…

SQL Injection

SQL Injection 就是通过把恶意的sql命令插入web表单递交给服务器&#xff0c;或者输入域名或页面请求的查询字符串递交到服务器&#xff0c;达到欺骗服务器&#xff0c;让服务器执行这些恶意的sql命令&#xff0c;从而让攻击者&#xff0c;可以绕过一些机制&#xff0c;达到直…

记一次前端直接上传图片到oss报错

前端直接上传图片到阿里云oss,相关过程官网和网上资料已经很详细&#xff0c;不做赘述。 但这个过程比较复杂&#xff0c;前后端对接过程中很容易出现报错&#xff0c;这里遇到了以下报错&#xff0c;不容易排查。 请求显示net::ERR_NAME_NOT_RESOLVED错误&#xff0c;catch输…

如何在windows电脑安装多个tomcat服务器和乱码问题

前提条件安装jdk 以17版本为例&#xff0c;将jdk8卸载干净 1.首先进入tomcat官网下载 tomcat网址 这里下载tomcat10为例子 1.1 这里选择方式一 下载解压版 2.解压后拷贝三份 分别命名为 8081、 8082、 8083 3.分别对每个tomcat执行以下操作 3.1 找到tomcat所在webapps文…

LeetCode[56]合并区间

难度&#xff1a;Medium 题目&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&…

Android Studio Giraffe控制台乱码

这几天在使用Android Studio Giraffe进行一个App的开发&#xff0c;在项目构建的时候&#xff0c;控制台输出中文都是乱码&#xff0c;看着很不爽&#xff0c;进行了两项配置&#xff0c;中文就可以正常输出了&#xff0c;看起来就爽多了。 第一个配置&#xff1a;点击Help菜单…