当前位置:网站首页>LeetCode·85.最大矩形·单调栈
LeetCode·85.最大矩形·单调栈
2022-08-04 15:51:00 【小迅想变强】
链接:https://leetcode.cn/problems/maximal-rectangle/solution/by-xun-ge-v-zhxr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目
示例
思路
解题思路
本题与84题思路大体相同,是84题的进阶题,可以移步先看看84题
84.题解
84题是在一维空间求最大矩形,本题是在二维空间求矩形,思路一样,可以将二维空间转换为一维空间与84题一模一样
暴力求解:
我们按照题目给定要求,枚举数组每一个元素,将对应的高和宽相乘组成面积,保存最大面积即可,因为给定为字符串,所以先对其进行处理,转换为二维整形数组,同时求其在Y方向的高
单调栈+哨兵:
通过暴力解法,时间消耗非常大
那么可以利用递增栈优化暴力暴力求解的过程
- 当元素大于栈顶元素时,入栈
- 当元素小于栈顶元素时,维护栈的递增性,将小于当前元素的栈顶元素弹出,并计算面积
在上面递增栈中,我们总是需要判断当前元素是否为最后元素或者为栈顶元素,很麻烦,那么可以在数组前后加上两个哨兵,充当坏点,在实际计算中不影响结果,但是简化我们的逻辑,正如我们高中或者初中学过的辅助线或者凑配法都是差不多的思路
具体实现看代码,注释超级详细
代码
暴力求解:
int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){
int dp[matrixSize][matrixColSize[0]];
memset(dp, 0, sizeof(dp));
for(int i = 0; i < matrixSize; i++)//计算对应高度
{
for(int j = 0; j < matrixColSize[0]; j++)
{
if(matrix[i][j] == '1')
{
dp[i][j] = (i == 0 ? 0 : dp[i-1][j])+1;
}
}
}
int max = 0;
for(int i = 0; i < matrixSize; i++)
{
for(int j = 0; j < matrixColSize[0]; j++)//计算每一个点能构成的最大面积
{
if(matrix[i][j] == '0')
{
continue;
}
int min = dp[i][j];//高
for(int k = j; k >= 0; k--)
{
if(matrix[i][k] == '0')
{
break;
}
min = fmin(min, dp[i][k]);//每次保存最小高
max = fmax(max, (j - k + 1) * min);
}
}
}
return max;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/maximal-rectangle/solution/by-xun-ge-v-zhxr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
单调栈+哨兵:
int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){
int dp[matrixSize][matrixColSize[0] + 2];//添加哨兵
memset(dp, 0, sizeof(dp));//初始化
for(int i = 0; i < matrixSize; i++)//计算对应高度
{
for(int j = 0; j < matrixColSize[0]; j++)
{
if(matrix[i][j] == '1')
{
dp[i][j+1] = (i == 0 ? 0 : dp[i-1][j+1])+1;
}
}
}
int max = 0;
for(int i = 0; i < matrixSize; i++)//转为一维,
{
int stack[matrixColSize[0]+2];//单调栈解法
int top = -1;
stack[++top] = 0;
for(int j = 1; j < matrixColSize[0]+2; j++)
{
while(dp[i][j] < dp[i][stack[top]])
{
max = fmax(max, (j - stack[top-1] - 1) * dp[i][stack[top]]);
--top;
}
stack[++top] = j;
}
}
return max;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/maximal-rectangle/solution/by-xun-ge-v-zhxr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
边栏推荐
猜你喜欢
不需要服务器,教你仅用30行代码搞定实时健康码识别
LeetCode·84.柱状图中最大的矩形·单调递增栈
花了半个月,终于把一线大厂高频面试题做成合集了
界面组件DevExpress ASP.NET Core v22.1 - 增强数据导出功能
What are the useful IT asset management platforms?
跟我学 UML 系统建模
解决dataset.mnist无法加载进去的情况
【已解决】allure无法生成json文件和AttributeError: module ‘allure‘ has no attribute ‘severity_level‘
What is an artifact library in a DevOps platform?What's the use?
Redis持久化操作
随机推荐
In action: 10 ways to implement delayed tasks, with code!
Summary of some pytorch knowledge points that have been updated for a long time
【Es6中的promise】
DevOps平台中的制品库是什么?有什么用处?
如何实时监控销售数据?销售看板来帮你!
直播回放含 PPT 下载|基于 Flink & DeepRec 构建 Online Deep Learning
多商户商城系统功能拆解24讲-平台端分销会员
For循环控制
C# 写系统日志
张乐:研发效能的黄金三角及需求与敏捷协作领域的实践|直播回顾
数据分析入门导读
dot net core 使用 usb
《电磁兼容防护EMC》学习笔记
跟我学 UML 系统建模
H5 之 文件流转base64下载
RSA306B,500,600系列API接口代码
第三章 Scala运算符
进程间通信方式
软件性能测试包括哪些内容?国内权威软件检测机构排名
06-总线