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

数据结构-全部由1组成的子矩形数量

给定一个二维数组matrix, 其中的值不是0就是1, 返回全部由1组成的子矩形数量。

import java.util.Stack;public class CountSubmatricesWithAllOnes {public static void main(String[] args) {int[][] mat = {{1,1,1,1,1,1},{1,1,1,1,1,1},{1,1,1,1,1,1}};System.out.println(numSubmat(mat));}public static int numSubmat(int[][] mat){if(mat == null || mat.length == 0 || mat[0].length == 0){return 0;}int nums = 0;int[] height = new int[mat[0].length];for (int i = 0; i < mat.length; i++) {for (int j = 0; j < mat[0].length; j++) {height[j] = mat[i][j] == 0 ? 0 : (height[j] + 1);}nums += countFromBottom(height);}return nums;}public static int countFromBottom(int[] height){if(height == null || height.length == 0){return 0;}int nums = 0;Stack<Integer> stack = new Stack<Integer>();for (int i = 0; i < height.length; i++) {if(!stack.isEmpty() && height[stack.peek()] >= height[i]){if(height[stack.peek()] == height[i]){stack.pop(); // 如果相等,就弹出栈,不计算当天弹出的索引stack.push(i);continue;}int popIndex = stack.pop();int h = height[popIndex];int leftIndex = stack.isEmpty() ? -1 : stack.peek();int lenght = i - leftIndex - 1; // 长度int leftHight = leftIndex == - 1 ? 0 : height[leftIndex];int rightHight = height[i];nums = nums + ( lenght * (lenght + 1) / 2 *  (h - Math.max(leftHight,rightHight)) );}stack.push(i);}while(!stack.isEmpty()){int popIndex = stack.pop();int h = height[popIndex];int leftIndex = stack.isEmpty() ? -1 : stack.peek();int lenght = height.length - leftIndex - 1; // 长度int leftHight = leftIndex == - 1 ? 0 : height[leftIndex];int rightHight = 0;nums = nums + ( lenght * (lenght + 1) / 2 *  (h - Math.max(leftHight,rightHight)) );}return nums;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Springboot统一给redis缓存的Key加前缀
  • 又一个坑爹:未启用约束一行或多行中包含违反非空、唯一或外键约束的值。
  • 并行 parallel DOP 受 Resource Manager 限制
  • spring框架简介
  • 网络工程师学习笔记——广域网通信
  • redis的aof日志配置项详解
  • AI大模型编写多线程并发框架(六十一):从零开始搭建框架
  • 【书生大模型实战营第三期 | 进阶岛第5关-茴香豆:企业级知识库问答工具】
  • 【深度学习】嘿马深度学习笔记第5篇:神经网络与tf.keras,学习目标【附代码文档】
  • BERT:用于语言理解的深度双向变形的预训练
  • linux系统中USB模块基本原理分析
  • SpingBoot集成kafka-发送读取消息示例
  • JS Blob与ArrayBuffer:深入解析二者关系及应用场景
  • 2024.8.26 Python,最大子数和与动态规划,最小路径和,分割回文串,字典序排数,最长重复子数组(动态规划)
  • Python中csv文件的操作2
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • HTML-表单
  • LeetCode18.四数之和 JavaScript
  • Material Design
  • React Transition Group -- Transition 组件
  • SpriteKit 技巧之添加背景图片
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Unix命令
  • 基于web的全景—— Pannellum小试
  • 运行时添加log4j2的appender
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • 阿里云ACE认证学习知识点梳理
  • # 安徽锐锋科技IDMS系统简介
  • #《AI中文版》V3 第 1 章 概述
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转) Face-Resources
  • (转)LINQ之路
  • .net core docker部署教程和细节问题
  • .net core 外观者设计模式 实现,多种支付选择
  • .Net Core和.Net Standard直观理解
  • .Net FrameWork总结
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 反射 Reflect
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET中使用Redis (二)
  • /bin、/sbin、/usr/bin、/usr/sbin
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [acm算法学习] 后缀数组SA
  • [Angular] 笔记 18:Angular Router
  • [BIZ] - 1.金融交易系统特点
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [C/C++]关于C++11中的std::move和std::forward
  • [C++][STL源码剖析] 详解AVL树的实现