用对角线去遍历矩阵

原题链接

用对角线遍历矩阵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.某些过程的结束条件是什么?

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序发布注意事项

1、使用HBuildx的 发布 功能发布小程序&#xff0c;因为编译完的代码目录不是同一个 如果使用 运行 到小程序&#xff0c;最后发布的版本会显示”无法连接本地服务器“ 2、使用unicloud的云服务 uniCloud发行 | uni-app官网 阿里云的unicloud的话&#xff0c;使用request域名…

高效实用小工具之Everything

一&#xff0c;简介 有时候我们电脑文件较多时&#xff0c;想快速找到某个文件不是一件容易的事情&#xff0c;实用windows自带的搜素太耗时&#xff0c;效率不高。今天推荐一个用来搜索电脑文件的小工具——Everything&#xff0c;本文将介绍如何安装以及使用everything&…

分布式监控平台—zabbix

前言一、zabbix概述1.1 什么是zabbix1.2 zabbix的监控原理1.3 zabbix常见五个应用程序1.4 zabbix的监控模式1.5 监控架构1.5.1 C/S&#xff08;server—client&#xff09;1.5.2 server—proxy—client1.5.3 master—node—client 二、部署zabbix2.1 部署 zabbix server 端2.2 …

记一次物理机安装centos7遇到的问题

首先制作U盘镜像&#xff08;之前装windows的大白菜之类的就没用了&#xff09; 用的这个UltraISO制作U盘镜像 然后从U盘启动开始安装&#xff0c; 问题一 安装时报错 dracut-pre-udev[351]:modprobe :ERROR:could not insert ‘floppy’ dracut-pre-udev[351]:modprobe…

ctfshow-web8

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 这道题实际上就是一个单纯的布尔型盲注&#xff0c;只不过是过滤了一些东西&#xff0c;一个是过滤的空格&#xff0c;还有一个是过滤了逗号 那么我们需要做的就是对这两个进行绕过&#xff0c;空格还是用/**…

【网络基础实战之路】实现RIP协议与OSPF协议间路由交流的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

Python Opencv实践 - 在图像上绘制图形

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png") print(img.shape)plt.imshow(img[:,:,::-1])#画直线 #cv.line(img,start,end,color,thickness) #参考资料&#xff1a;https://blog.csdn.ne…

词法分析器的设计与实现

1、实验目的及要求 1.1、实验目的 加深对词法分析器的工作过程的理解&#xff1b;加强对词法分析方法的掌握&#xff1b;能够采用一种编程语言实现简单的词法分析程序&#xff1b;能够使用自己编写的分析程序对简单的程序段进行词法分析。 1.2、实验要求 1&#xff09;对单词…

Windows - UWP - 为UWP应用创建桌面快捷方式

Windows - UWP - 为UWP应用创建桌面快捷方式 前言 这是一个较为简单的方式&#xff0c;不需要过多的命令行。 How 首先Win R -> shell:AppsFolder -> 回车&#xff0c; 这将显示电脑上的已安装应用&#xff08;Win32 & UWP&#xff09;&#xff1a; 找到想要创建…

38 | 浦发银行股票分析案例

本文将通过一个浦发银行股票分析案例,探讨如何从多个维度对股票进行分析,包括基本面、技术面和市场环境等因素。我们将深入挖掘浦发银行的财务数据、业务模式以及市场定位,以了解其内在价值和潜在风险。同时,我们还将考察技术面的指标,如价格走势、均线形态等,以揭示市场…

计算机网络—IP

这里写目录标题 IP的基本认识网络层与数据链路层有什么关系IP地址基础知识IP 地址的分类什么是A、B、C类地址广播地址用来做什么什么是D、E类广播多播地址用于什么IP分类的优点IP分类的缺点 无分类地址CIDR如何划分网络号和主机号怎么进性子网划分 公有 IP 地址与私有 IP 地址公…

java操作mongdb【超详细】

Java操作 搭建 搭建 依赖 <!--mongodb--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>配置文件 spring:data:mongodb:host…

回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本…

Django配置(部署环境较乱,暂时启用)

django配置 web服务器中部署项目及WSGI简介 web服务器 WSGI 在IIS中部署django项目 安装 wfastcgi &#xff1a;pip install wfastcgi安装IIS&#xff1a; 以上选择项勾选后确定 将CGI文件复制到项目中&#xff0c; 将项目复制到IIS默认目录中 部署IIS 添加变量信息如下…

定义行业新标准?谷歌:折叠屏手机可承受20万次折叠

根据Patreon账户上的消息&#xff0c;Android专家Mishaal Rahman透露&#xff0c;谷歌计划推出新的硬件质量标准&#xff0c;以满足可折叠手机市场的需求。Android原始设备制造商&#xff08;OEM&#xff09;将需要完成谷歌提供的问卷调查&#xff0c;并提交样品设备进行严格审…

计算机网络 ARP协议 IP地址简述

ARP只能在一个链路或一段网络上使用

【设计模式——学习笔记】23种设计模式——解释器模式Interpreter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

案例引入 通过解释器模式来实现四则运算&#xff0c;如计算ab-c的值&#xff0c;具体要求 先输入表达式的形式&#xff0c;比如abc-de&#xff0c;要求表达式的字母不能重复在分别输入a,b,c,d,e的值最后求出结果 传统方案 编写一个方法&#xff0c;接收表达式的形式&#xf…

【设计模式】MVC 模式

MVC 模式代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式。这种模式用于应用程序的分层开发。 Model&#xff08;模型&#xff09; - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑&#xff0c;在数据变化时更新控制器。View&#xff…

MES系统在机器人行业生产管理种的运用

机器人的智能水平也伴随技术的迭代不断攀升。 2021年的春晚舞台上&#xff0c;来自全球领先工业机器人企业abb的全球首款双臂协作机器人yumi&#xff0c;轻松自如地表演了一出写“福”字&#xff0c;赢得了全国观众的赞叹。 在汽车装配领域&#xff0c;一台机器人可以自主完成一…

OpenCV实例(八)车牌字符识别技术(一)模式识别

车牌字符识别技术&#xff08;一&#xff09;模式识别 1.模式识别流程2. 模式识别方式 影响并导致汽车牌照内字符出现缺损、污染、模糊等情况的常见因素有照相机的性能、采集车辆图像时光照的差异、汽车牌照的清洁度等。为了提高汽车牌照字符识别的准确率&#xff0c;本节将把英…