单调栈练习(三)— 最大矩形

题目
同样是LeetCode原题:题目链接
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

在这里插入图片描述

暴力解
先来看一下暴力解的时间复杂度。
假如一个N * N的大矩阵,想要枚举出来所有的子矩阵时间复杂度是多少? O ( N 4 ) O(N^4) O(N4)
是这样算的:
在N * N中随便点一个点A的可能性是 O ( N 2 ) O(N^2) O(N2)种,再随便点一个点B,同样也是 O ( N 2 ) O(N^2) O(N2)种可能性。
这两个点,一个在左上角,一个在右下角,就能够构成一个子矩阵,整体的时间复杂度是 O ( N 4 ) O(N^4) O(N4)

就算是点的点重复,那也只是重复了一次,不影响结果。所以枚举所有子矩阵的整体时间复杂度为 O ( N 4 ) O(N^4) O(N4)

整个暴力解的思路就是,先用4个for循环枚举出来所有的子矩阵(时间复杂度为 O ( N 4 ) O(N^4) O(N4)),再验证所有的子矩阵中的值是否都是1,并求出最大值。时间复杂度 O ( N 2 ) O(N^2) O(N2)。整个暴力解的时间复杂度为 O ( N 6 ) O(N^6) O(N6)

单调栈
单调栈用到了一个技巧:压缩数组 。优化下后的整体时间复杂度是 O ( N 2 ) O(N^2) O(N2)

数组压缩的技巧可以将给定的二维数组构建成自己想要的柱状图,并利用单调栈,弹出当前栈顶元素,以当前栈顶元素的值为子矩阵中统一的高,并且找到左右区间最近且小的值作为边界,根据中间部分符合条件的值求出其最大面积,这部分具体可以看上一篇文章,可以说是一毛一样柱状图中最大的矩形。

在遍历给定的二维数组并构建压缩数组的过程中,如果 arr[i] [j] 和 arr[i + 1] [j] 位置的值都为1,则压缩完的数组中arr[j] 位置的值应该进行累加为2,如果中间断掉为0,则构建出来的柱状图对应的位置为0。

这样就能求出以二维数组中的每一行为底、每一行的每一个为子矩阵的高的每一个子矩阵的面积是多少。
遍历完整个二维数组后,最大面积也就求出来了。

代码
二维数组每遍历完一行,就求一次以当前行为底的所有子矩阵的最大面积。
maxRecFromBottom和上一篇帖子的解题思路一样柱状图中最大的矩形。

 public static int maximalRectangle(char[][] matrix) {if (matrix == null || matrix[0].length == 0){return 0;}int N = matrix[0].length;int M = matrix.length;int[] helpArr = new int[N];Integer max = Integer.MIN_VALUE;for (int i = 0; i < M; i++) {for (int j = 0; j < N; j++) {helpArr[j] = matrix[i][j] == '0' ? 0 : helpArr[j] + 1;}max = Math.max(max,maxRecFromBottom(helpArr));}return max;}public static int maxRecFromBottom(int[] height) {Stack<Integer> stack = new Stack<>();Integer max = Integer.MIN_VALUE;for (int i = 0; i < height.length; i++) {while (!stack.isEmpty() && height[i] < height[stack.peek()]) {Integer cur = stack.pop();Integer leftMin = stack.isEmpty() ? -1 : stack.peek();max = Math.max(max,(i - leftMin - 1) * height[cur]);}stack.push(i);}while (!stack.isEmpty()){Integer cur = stack.pop();Integer leftMin = stack.isEmpty() ? -1 : stack.peek();max = Math.max(max,(height.length - leftMin - 1) * height[cur]);}return max;}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[后端] 微服务的前世今生

微服务的前世今生 整体脉络: 单体 -> 垂直划分 -> SOA -> micro service 微服务 -> services mesh服务网格 -> future 文章目录 微服务的前世今生单一应用架构特征优点&#xff1a;缺点&#xff1a; 垂直应用架构特征优点缺点 SOA 面向服务架构特征优点缺点 微服…

vscode配置与注意事项

中文设置 https://zhuanlan.zhihu.com/p/263036716 应用搜索输入“Chinese (Simplified) Language Pack for Visual Studio Code”并敲回车键 底部信息窗没有的话 首先使用快捷键ctrlshiftp&#xff0c;Mac用户使shiftcommandp&#xff0c;然后输入settings.json 将下面的选…

cosmos及特定应用程序的区块链

特定应用程序的区块链,简单来说&#xff0c;一个区块链就是一个专门的应用程序。为了实现某一特定的去中心化应用而专门实现一个区块链。 传统的用智能合约构建去中心化应用不行吗&#xff1f; 灵活性不足&#xff1a;智能合约本质上受到虚拟机本身的限制。例如&#xff0c;以…

算法第十二天-最大整除子集

最大整除子集 题目要求 解题思路 来自[宫水三叶] 根据题意&#xff1a;对于符合要求的[整除子集]中的任意两个值&#xff0c;必然满足[较大数]是[较小数]的倍数 数据范围是 1 0 3 10^3 103&#xff0c;我们不可能采取获取所有子集&#xff0c;再检查子集是否合法的暴力搜解法…

字体图标操作步骤

网站 直接点击 进去后长这样&#xff0c;点免费的添加 保存下载 保存后解压 把fonts文件夹复制粘贴到我们自己项目 可以放在同images的路径下 引入 来源于 再style中粘贴 font-face {font-family: icomoon;src: url(fonts/icomoon.eot?jyg4cp);src: url(fonts/icomoo…

数据结构及单链表例题(下)

上次我们已经了解了单链表的数据结构定义以及创建单链表的两种方法,这节介绍几道例题. 文章目录 前言 一、已知L为带头结点的单链表,请依照递归思想实现下列运算 二、单链表访问第i个数据节点 三、在第i个元素前插入元素e 四、删除第i个结点 五、查找带头结点单链表倒数第…

从0开始python学习-45.pytest框之将所有的用例封装到一个类中,实现极限封装,并测试用例校验

目录 1. 封装一个用于校验yaml测试用例参数的方法&#xff1a;model_util.py 2. 校验方法是否正确 3. 封装一个方法&#xff0c;用于读取所有的用例&#xff1a;test_all_case.py 1. 封装一个用于校验yaml测试用例参数的方法&#xff1a;model_util.py from dataclasses imp…

Python从入门到网络爬虫(23个Python开源项目)

前言 随着互联网的快速发展&#xff0c;大量的信息被不断地产生和积累&#xff0c;这也使得网络爬虫变得越来越重要。而Python作为一门高效、易用的编程语言&#xff0c;被广泛地应用于网络爬虫领域。本文将从多个角度分析Python开源爬虫项目的优缺点、应用场景以及未来发展方…

Kubernets(K8S)启动和运行01 快速入门

简介 Kubernetes is an open source orchestrator for deploying containerized applications. It was originally developed by Google, inspired by a decade of experience deploying scalable, reliable systems in containers via application-oriented APIs. Kubernete…

智能合约笔记

前言&#xff1a; 首先了解下为什么会出现智能合约&#xff0c;打个比方现在有两个人A和B打赌明天会不会下雨&#xff0c;每个人赌注100元&#xff0c;如果第二天下雨则A拿走200元&#xff0c;否则B拿走200元&#xff0c;这样就有一个问题&#xff0c;赌注要到第二天才能见效&…

three.js实现雷达扫描效果(纹理贴图)

three.js实现雷达扫描效果&#xff08;纹理贴图&#xff09; 图例 步骤 创建两个平面&#xff0c;分别纹理贴图&#xff0c;底图模型.add&#xff08;光波模型&#xff09;关闭材质的深度测试光波旋转 代码 <template><div class"app"><div ref&q…

RT-Thread:SPI万能驱动 SFUD 驱动Flash W25Q64,通过 STM32CubeMX 配置 STM32 SPI 驱动

关键词&#xff1a;SFUD,FLASH,W25Q64&#xff0c;W25Q128&#xff0c;STM32F407 说明&#xff1a;RT-Thread 系统 使用 SPI万能驱动 SFUD 驱动 Flash W25Q64&#xff0c;通过 STM32CubeMX 配置 STM32 SPI 驱动。 提示&#xff1a;SFUD添加后的存储位置 1.打开RT-Thread Sett…