当前位置: 首页 > news >正文

leetcode面试题17.最大子矩阵

sooooooo long没刷题了,汗颜
题目链接:leetcode面试题17

1.题目

给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。

返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。

n,m<-200

2.分析

1)最初想到的版本:
首先f[i][j][0]表示第i行前j个格子的前缀和,f[i][j][1]表示第j列前i个格子的前缀和,那么以len1,len2,col1,col2为左上角和右下角的矩阵的子矩阵和为:f[len2][col2][2]-f[len2][col1-1][2]-f[len1-1][col2][2]+f[len1-1][col1-1][2];但这样我们就需要枚举len1,len2,col1,col2,复杂度为NNMM
2)在此基础上优化,我们可以发现,在确定了len1,len2,col1时,我们只需要使得f[len2][col2][2]-f[len1-1][col2][2]最大即可,那么我们把col1从n-1->0枚举的过程中可以逐步去比较当前最大的f[len2][col2][2]-f[len1-1][col2][2]和当col2=col1时的f[len2][col2][2]-f[len1-1][col2][2]谁更大,维护一下最大值即可,那么复杂度降低为M
M*N,可以AC

3.代码

class Solution {
public:int f[210][210][5];static bool mycmp(vector<int> x,vector<int> y){return x[0]>y[0];}int get_sum(int len1,int len2,int col1,int col2){return f[len2][col2][2]-f[len1-1][col2][2];}vector<int> getMaxMatrix(vector<vector<int>>& matrix) {memset(f,0,sizeof(f));int m=matrix.size(),n=matrix[0].size();for(int i=0;i<m;i++)for(int j=0;j<n;j++){int len=i+1,col=j+1,c=matrix[i][j];f[len][col][0]=f[len-1][col][0]+c;f[len][col][1]=f[len][col-1][1]+c;f[len][col][2]=f[len-1][col-1][2]+f[len][col-1][1]+f[len-1][col][0]+c;}int ans=matrix[0][0],r1=0,r2=0,c1=0,c2=0;for(int i=0;i<m;i++)for(int k=i;k<m;k++){int len1=i+1,len2=k+1,col2=n;int col_sum=f[len2][col2][2]-f[len1-1][col2][2];for(int j=n-1;j>=0;j--){int col1=j+1;if(get_sum(len1,len2,col1,j+1)>col_sum){col_sum=get_sum(len1,len2,col1,j+1);col2=j+1;}int ans_test=f[len2][col2][2]-f[len2][col1-1][2]-f[len1-1][col2][2]+f[len1-1][col1-1][2];if(ans_test>ans){ans=ans_test;r1=i,c1=j,r2=k,c2=col2-1;}}}vector<int> ans_vec;ans_vec.push_back(r1);ans_vec.push_back(c1);ans_vec.push_back(r2);ans_vec.push_back(c2);return ans_vec;}};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Windows系统安全加固方案:快速上手系统加固指南 (下)
  • c#自动关闭 MessageBox 弹出的窗口
  • 【Pytorch】当num_workers > 0时,程序卡住
  • Vue2.
  • MySQL查询优化:提升数据库性能的策略
  • 如何查找下载安装安卓APK历史版本?
  • CUDA编程之grid和block详解
  • 【第六天】TCP和UDP的区别 TCP连接如何确保可靠性
  • LC 128.最长连续序列
  • 【计算机网络】数据链路层实验
  • Redis-高级实战案例
  • 基于 HTML+ECharts 实现智慧交通数据可视化大屏(含源码)
  • 老司机通过一张图片就能看懂HTTP和HTTPS的区别
  • 掌握 Symfony 路由系统:配置与管理
  • 【Django】ajax和django接口交互(获取新密码)
  • 收藏网友的 源程序下载网
  • [LeetCode] Wiggle Sort
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • ➹使用webpack配置多页面应用(MPA)
  • Brief introduction of how to 'Call, Apply and Bind'
  • ES6核心特性
  • JDK9: 集成 Jshell 和 Maven 项目.
  • JS+CSS实现数字滚动
  • Making An Indicator With Pure CSS
  • Python学习之路16-使用API
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 翻译:Hystrix - How To Use
  • 目录与文件属性:编写ls
  • 如何使用 JavaScript 解析 URL
  • 移动端 h5开发相关内容总结(三)
  • ​补​充​经​纬​恒​润​一​面​
  • #pragma预处理命令
  • #微信小程序(布局、渲染层基础知识)
  • #在 README.md 中生成项目目录结构
  • $.ajax中的eval及dataType
  • (007)XHTML文档之标题——h1~h6
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Ruby)Ubuntu12.04安装Rails环境
  • (备忘)Java Map 遍历
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (简单) HDU 2612 Find a way,BFS。
  • (论文阅读11/100)Fast R-CNN
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • ./configure,make,make install的作用
  • .net 反编译_.net反编译的相关问题
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .net6Api后台+uniapp导出Excel
  • .net的socket示例
  • .考试倒计时43天!来提分啦!
  • ;号自动换行
  • @Not - Empty-Null-Blank
  • [ 蓝桥杯Web真题 ]-布局切换