最大子矩阵+01矩阵

news2024/9/22 17:23:40
最大子矩阵
题目

思路

确定一个矩阵中的子矩阵,只需要确定矩阵对角线上两点的坐标即可,

在确定了子矩阵之后,还需要计算子矩阵中各元素之和,如果按照常规的循环方法来解决,时间复杂度是O(N^6),对于本题200长度大小,会超时,所以应该再另寻方法,仔细思考一番发现,确定子矩阵的四层循环,似乎是在所难免的,那么接下来的重点就是处理子矩阵中各元素和上边了,可以采用如下方法:定义一个同原始矩阵大小一样的矩阵,定义dp[i][j]为以[0][0]和[i][j]顶点矩阵的各元素之和,如果提前计算好,即将dp[][]的初始化和填表完成在寻找子矩阵之前,那么时间复杂度就变成了O(N^4),当确定好dp[][]之后,当确定了子矩阵的对角线上两点的坐标后,例如(x1,y1)和(x2,y2),将采取如下方法进行计算

填写dp[][]表时,当填写红色位置的值时,只需将S(紫)+S(绿)-S(蓝)+红色位置在原始矩阵中对应的值即可,即dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+matrix[i-1][j-1].(假设dp表比原始矩阵多一行,多一列)。

那么接下来在完成dp表的填写后,确定子矩阵的元素之和大小可采用如下方法:

确定红色区域之和=整个区域-绿色区域-紫色区域+橙色区域

S(红)= dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1].

在完成以上点之后,接下来确定最大子矩阵的坐标就信手拈来了,定义一个变量记录之前的最大值,当遇到破纪录的值时,更新最大子矩阵的坐标。

代码
class Solution {
public:
    int dp[210][210];

    vector<int> getMaxMatrix(vector<vector<int>>& matrix) {
        vector<int> ans(4);
        int a,b,c,d;
        int m=matrix.size(),n=matrix[0].size();
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+matrix[i-1][j-1];
        int ma=INT_MIN;
        for(int x1=1;x1<=m;x1++)
            for(int y1=1;y1<=n;y1++)
                for(int x2=x1;x2<=m;x2++)
                    for(int y2=y1;y2<=n;y2++)
                    {
                        int ret=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];
                        if(ret>ma){
                            ma=ret;
                            // ans[0]=x1-1,ans[1]=y1-1,ans[2]=x2-1,ans[3]=y2-1;
                            a=x1-1,b=y1-1,c=x2-1,d=y2-1;
                        }
                    }
        ans[0]=a,ans[1]=b,ans[2]=c,ans[3]=d;
        return ans;
    }
};

经过试验发现,如果采用注释掉的方法进行更新,会超时,但是采用上边的方法,就可以通过了。

01矩阵
题目

思路

采用广度优先遍历来解决,创建一个同原始矩阵同样大小的矩阵dists,矩阵中各位置的值为该点距离0的最短距离,对于原始矩阵中值为0的点,在dists矩阵中对应的值为0,首先将原始矩阵中值为0的点放到队列中,然后不断地进行广度优先遍历,对于没遍历过的点,放入队列中,直到队列为空,更新结束。

代码
class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
        int m=mat.size(),n=mat[0].size();
        vector<vector<int>> dists(m,vector<int>(n,INT_MAX));
        queue<pair<int,int>> q;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                if(mat[i][j]==0){
                    q.push({i,j});
                    dists[i][j]=0;
                }   
            }
        int dx[4]={0,0,1,-1};
        int dy[4]={-1,1,0,0};
        while(!q.empty()){
            int a=q.front().first;
            int b=q.front().second;
            int dist=dists[a][b];
            q.pop();
            for(int k=0;k<4;k++){
                int x=a+dx[k];
                int y=b+dy[k];
                if(x>=0 && x<m && y>=0 && y<n){
                    if(dists[x][y]>dist+1){
                        dists[x][y]=dist+1;
                        q.push({x,y});
                    }
                }
            }
        }
        return dists;
    }
};

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

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

相关文章

Java——图书管理系统万字详解(附代码)

框架搭建 book包 将书相关的放到book包中&#xff0c;创建一个Book类用来设置书的属性&#xff0c;包括书名、作者、价格、类型、是否被借出等。 以上属性均被private所修饰 利用编译器生成构造方法&#xff08;不需要构造isBorrowed&#xff0c;因为其初始值为false&#…

2024年5月大语言模型论文推荐:模型优化、缩放到推理、基准测试和增强性能

前一篇文章总结了关于计算机视觉方面的论文&#xff0c;这篇文章将要总结了2024年5月发表的一些最重要的大语言模型的论文。这些论文涵盖了塑造下一代语言模型的各种主题&#xff0c;从模型优化和缩放到推理、基准测试和增强性能。 大型语言模型(llm)发展迅速&#xff0c;跟上…

8个图神经网络的典型用例

虽然 ChatGPT 或 Diffusion 模型等 AI 系统最近备受关注&#xff0c;但图神经网络 (GNN) 却发展迅速。在过去的几年中&#xff0c;GNN 悄然成为众多激动人心的新成就背后的黑马&#xff0c;这些成就从纯学术研究突破一路发展到大规模积极部署的实际解决方案。 Uber、谷歌、阿里…

idea configuration 配置 方便本地启动环境切换

idea 再项目启动的时候避免切换环境导致上线的时候出现环境配置问题 可以再idea 的 configuration 中配置项目的 vm options 虚拟机的内容占用 -Xmx256m -Xms256m -Xmn100m -Xss256k program arguments properties 文件中需要修改的配置参数 active profiles 指定启动的本…

快速幂求逆元与逆元

我上一篇博客链接写的是多个数求乘法逆元而快速幂求逆元用于单个数求乘法逆元 逆元是对分数取模用的 对于除法取模不成立&#xff0c;即(a/b)%p≠(a%p/b%p)%p。求逆元的思路&#xff1a;(一般ACM的题目都是对1e97这种素数取模&#xff0c;所以gcd(a,p)1)a*b1(mod p) > b1/a…

毕设 大数据校园卡数据分析

文章目录 0 前言1 课题介绍2 数据预处理2.1 数据清洗2.2 数据规约 3 模型建立和分析3.1 不同专业、性别的学生与消费能力的关系3.2 消费时间的特征分析 4 Web系统效果展示5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设…

STM32F1之OV7725摄像头·像素数据输出时序、FIFO 读写时序以及摄像头的驱动原理详解

STM32F1之OV7725摄像头-CSDN博客 STM32F1之I2C通信-CSDN博客 目录 1. 像素数据输出时序 2. FIFO 读写时序 2.1 写时序 2.2 读时序 3. 摄像头的驱动原理 1. 像素数据输出时序 主控器控制 OV7725 时采用 SCCB 协议读写其寄存器&#xff0c;而它输出图像时则使用 VGA 或…

【Linux signal】

Linux signal 一、信号分类二、什么是信号集&#xff1f;三、信号的3个处理过程3.1 发送信号3.1.1 向自身发送信号(raise)3.1.2 向别的进程发送信号(kill)3.1.3 发送闹钟信号(alarm) 3.2 接收(注册)信号3.3 处理信号 在Linux操作系统中&#xff0c;SIGUSR1和SIGUSR2是用户定义的…

仅需一块 4GB 的 GPU ,就能运行开源大语言模型:Llama3 70B

最强的开源大语言模型 Llama3 已经发布一段时间了&#xff0c;一些盆友资源有限&#xff0c;私信询问是否可以使用 4GB 的 VRAM 在本地运行 Llama3 70B。 与 GPT-4 相比&#xff0c;Llama3 的性能如何&#xff1f;Llama3 使用了哪些关键的前沿技术使其变得如此强大&#xff1f…

CIM模型

CIM 是 Esri 制图信息模型。 它是一个地图内容规范,用于记录在保存、读取、引用或打开时如何永久保留描述不同项目组件的信息。 该规范以 JSON 表示,适用于 ArcGIS 应用程序和 API 中的地图、场景、布局、图层、符号和样式。 CIM 不仅限于制图设置。 要了解属性的组织方式以及…

【C++题解】1699 - 输出是2的倍数,但非3的倍数的数

问题&#xff1a;1699 - 输出是2的倍数&#xff0c;但非3的倍数的数 类型&#xff1a;循环 题目描述&#xff1a; 请从键盘读入一个整数 n&#xff0c;输出 1∼n 中所有是 2 的倍数&#xff0c;但非 3 的倍数的数&#xff0c;每行 1个。 比如&#xff0c;读入一个整数10 &…

六招搞定,SPA单页面加载速度慢的问题。

众所周知&#xff0c;SPA页面有很多优点&#xff0c;但是首屏加载慢的问题一直被诟病&#xff0c;本文介绍几种解决策略&#xff0c;希望对老铁们有所帮助。 一、SPA页面的独有优势 1. 更快的用户体验&#xff1a; SPA在加载初始页面后&#xff0c;可以在用户与应用程序交互…

k8s dashboard安装

本案例&#xff0c;k8s版本为v1.22.17&#xff0c;所以安装v2.7.0版本的dashboard 1、下载dashboard的yaml文件 curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 2、修改recommended.yaml文件 修改定义的Service&…

HDFS 组织架构

优质博文&#xff1a;IT-BLOG-CN 一、HDFS 概述 HDFS 产生背景&#xff1a; 随着数据量越来越多&#xff0c;一个系统存储不下所有的数据&#xff0c;那么就需要分配到多个操作系统的磁盘中进行存储&#xff0c;但是不方便管理和维护&#xff0c;迫切需要一种系统来管理多台机…

蜜罐技术是一种什么防御技术?实现原理是什么?

前言&#xff1a;蜜罐技术的出现改变了这种被动态势&#xff0c;它通过吸引、诱骗攻击者&#xff0c;研究学习攻击者的攻击目的和攻击手段&#xff0c;从而延缓乃至阻止攻击破坏行为的发生&#xff0c;有效保护真实服务资源。 自网络诞生以来&#xff0c;攻击威胁事件层出不穷…

设置虚拟机为静态IP

为什么需要设置静态IP&#xff1a;有时候我们在练习项目的时候&#xff0c;明明已经连接好了虚拟机的ip&#xff0c;某一天突然连接不上了&#xff0c;通过ifconfig命令查看发现虚拟机的ip发生了变化&#xff0c;导致之前做的内容都需要重新布置&#xff0c; 一、设置静态IP …

AI办公自动化:用kimi将子文件夹里面的文件批量重命名

工作任务和目标&#xff1a;一个文件夹下有多个子文件夹 子文件夹中有多个srt文件&#xff0c;需要删除文件名中的english和空格 第一步&#xff0c;在kimi中输入如下提示词&#xff1a; 你是一个Python编程高手&#xff0c;一步步的思考&#xff0c;来编写下面任务的Python脚…

如何使用pycrypt加密工具测试反病毒产品的检测性能

关于pycrypt pycrypt是一款基于Python 3语言开发的加密工具&#xff0c;广大研究人员可以使用该工具来尝试绕过任意类型的反病毒产品&#xff0c;以检测目标反病毒产品的安全性能。 功能介绍 1、目前已知反病毒产品检测率为0/40&#xff1b; 2、支持绕过任意EDR解决方案&#…

【C++】类与对象——继承详解

目录 一、继承的概念 二、继承关系和访问限定符 三、基类和派生类对象赋值转换 四、继承中的作用域 五、派生类的默认成员函数 六、复杂的菱形继承及菱形虚拟继承 一、继承的概念 继承是面向对象程序设计中很重要的一个概念。继承允许我们依据另一个类来定义一个类&#…

python01

一、Python介绍 Python是一个计算编程语言&#xff0c;可以实现计算程序开发&#xff0c;也可以用于数据处理。SQL语言只能用于结构化数据的处理。Python的比SQL应用更广泛。 1990年推广Python&#xff0c;最初是应用于运维开发&#xff0c;随着不断更新迭代Python的功能更加丰…