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

【力扣:1504】统计全1子矩阵

统计全1子矩阵个数

在这里插入图片描述
思路1:首先考虑深度优先模拟,从【0,0】出发向下、右扩展,符合条件res++,最后输出res,比较直观,但重复进行了大量节点遍历操作,时间复杂度较高,数据量大时会超时

class Solution {unordered_set<int>set;int res=0;void get(vector<vector<int>>& mat,int start_r,int start_c,int row,int col){if(row>=mat.size()||col>=mat[0].size()||set.count(start_r+(start_c+((row+col*151)*151))*151)) return;for(int i=start_r;i<=row;i++){if(!mat[i][col]) return;}for(int i=start_c;i<=col;i++){if(!mat[row][i]) return;}res++;set.insert(start_r+(start_c+((row+col*151)*151))*151);get(mat,start_r,start_c,row+1,col);get(mat,start_r,start_c,row,col+1);}
public:int numSubmat(vector<vector<int>>& mat) {for(int i=0;i<mat.size();i++){for(int j=0;j<mat[0].size();j++){get(mat,i,j,i,j);}}return res;}
};

思路2:单考虑行或列时每增加1个1,结果增加 行或列1个数+1,那么多行多列时每增加一行或一列增加(1+2+…+n)*(m+1),加列时:n为行数,m为原来列数,实际上情景就是第一个图的拓展,只不过矩形中的1实际上是长度相等的全1矩形
在这里插入图片描述

因而仅需要使用一个二维数组tmp存储target[i][j]及前有几个连续的1,然后从上到下加上min(tmp[i][j],tmp_pre_min)即可
在这里插入图片描述

class Solution {
public:int numSubmat(vector<vector<int>>& mat) {int n = mat.size();int m = mat[0].size();vector<vector<int> > row(n, vector<int>(m, 0));for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (j == 0) {row[i][j] = mat[i][j];} else if (mat[i][j]) {row[i][j] = row[i][j - 1] + 1;}else {row[i][j] = 0;}}}int ans = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {int col = row[i][j];for (int k = i; k >= 0 && col; --k) {col = min(col, row[k][j]);ans += col;}}}return ans;}
};

单调栈优化后代码:

class Solution {
public:int numSubmat(vector<vector<int>>& mat) {int n = mat.size();int m = mat[0].size();vector<vector<int> > row(n, vector<int>(m, 0));for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (j == 0) {row[i][j] = mat[i][j];} else if (mat[i][j]) {row[i][j] = row[i][j - 1] + 1;}else {row[i][j] = 0;}}}int ans = 0;for (int j = 0; j < m; ++j) { int i = 0; stack<pair<int, int> > Q; int sum = 0; while (i <= n - 1) { int height = 1; while (!Q.empty() && Q.top().first > row[i][j]) {// 弹出的时候要减去多于的答案sum -= Q.top().second * (Q.top().first - row[i][j]); height += Q.top().second; Q.pop(); } sum += row[i][j]; ans += sum; Q.push({ row[i][j], height }); i++; } } return ans;}
};

相关文章:

  • 物奇平台耳机复位功能实现
  • 简述 HTTP 请求的过程是什么?
  • 哪款手机便签软件支持存储录音文件并支持转文字?
  • 快速搭建PHP管理后台
  • ipad可能会在iOS 16中失去智能家居中心功能
  • 学习c#的第三天
  • 快速搭建开源分布式任务调度系统DolphinScheduler并远程访问
  • 开发知识点-NodeJs-npm/Pnpm/Vite/Yarn包管理器
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • SQLI手动注入和python sqlmap代码注入
  • 大数据毕业设计选题推荐-超级英雄运营数据监控平台-Hadoop-Spark-Hive
  • 使用【Python+Appium】实现自动化测试
  • HBase学习笔记(1)—— 知识点总结
  • C#,Python实践,用CodeFormer实现人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色
  • uniapp-实现微信授权登录
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Apache的基本使用
  • crontab执行失败的多种原因
  • emacs初体验
  • Nodejs和JavaWeb协助开发
  • PermissionScope Swift4 兼容问题
  • STAR法则
  • Webpack入门之遇到的那些坑,系列示例Demo
  • win10下安装mysql5.7
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 机器学习 vs. 深度学习
  • 聊聊directory traversal attack
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 区块链将重新定义世界
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 项目管理碎碎念系列之一:干系人管理
  • 用Visual Studio开发以太坊智能合约
  • hi-nginx-1.3.4编译安装
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 组复制官方翻译九、Group Replication Technical Details
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (AngularJS)Angular 控制器之间通信初探
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (转) ns2/nam与nam实现相关的文件
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)linux 命令大全
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)大型网站架构演变和知识体系
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .pyc文件是什么?