84. 柱状图中最大的矩形

遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下

图片源自leetcode力扣

一.暴力解法(超时)

遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下

时间复杂度O(n*n)

空间复杂度O(1)

代码:

class Solution {
public:int largestRectangleArea(vector<int>& heights) {
//最大面积,初始为0
int maxa=0;
for(int i=0;i<heights.size();i++)
{//从高度为heights[i]向两边扩散,直到高度小于heights[i]时停止,求面积int height=heights[i];
//边界为(left,right)int left=i;int right=i;
//求左边界leftwhile(left>=0&&heights[left]>=heights[i]){left--;}
//求右边界rightwhile(right<=heights.size()-1&&heights[right]>=heights[i]){right++;}
//更新最大面积maxa=max(maxa,(right-left-1)*heights[i]);}
return maxa;}
};

二.单调栈

单调栈模板:

stack<int>st;
vector<int>vec(数组元素个数);
//△需要变动的地方△for( i :遍历数组)
while (!st.empty()&&△st.top() nums[i])//栈顶元素与x比较{st.pop();}//如果栈为空,说明没有左面比当前元素更小的元素if (st.empty())vec[i]=-1 ;else//如果栈不为空,则栈顶就是左面第一个比当前元素更小的元素△vec[i]=st.top();//当前元素进栈△st.push(nums[i]);
}

模板说明:

一共有4种情况:

给定一个数组nums:

(1)vec保存nums每个元素左边第一个比该元素小的元素:

○正序遍历数组:for(int i=0;i<nums.size();i++)

○单调递增栈:st.top()>=nums[i]

(2)vec保存nums每个元素左边第一个比该元素大的元素:

○ 正序遍历数组:for(int i=0;i<nums.size();i++)

○ 单调递减栈:st.top()<=nums[i]

(3)vec保存nums每个元素右边第一个比该元素小的元素:

○    逆序遍历数组:for(int i=nums.size()-1;i>=0;i--)

○        单调递增栈:st.top()>=nums[i]

(4)vec保存nums每个元素右边第一个比该元素小的元素:

○   逆序遍历数组:for(int i=nums.size()-1;i>=0;i--)

○      单调递增栈:st.top()>=nums[i]

如果vec存放的是下标:

变动两个地方:

○改成nums[st.top]与nums[i]比较

○最后改为st.push(i)

思路:

用两个数组left_min和right_min存放heigts[i]左边和右边第一个比它小的元素的下标

如果不存在返回-1,nums.size()

则以heights[i]为高的最大矩形面积为(right_min[i]-left_min[i]-1)*heights[i]

代码:

class Solution {
public:int largestRectangleArea(vector<int>& heights) {
//left_min记录左边第一个比heights小的下标,如果没有返回-1
vector<int>left_min(heights);
//right_min记录右边第一个比heights小的下标,如果没有返回-1
vector<int>right_min(heights);stack<int>st;
for(int i=0;i<heights.size();i++)
{while(!st.empty()&&heights[st.top()]>=heights[i])st.pop();if(st.empty()){left_min[i]=-1;}else{left_min[i]=st.top();}st.push(i);
}
stack<int>st1;
for(int i=heights.size()-1;i>=0;i--)
{while(!st1.empty()&&heights[st1.top()]>=heights[i])st1.pop();if(st1.empty()){right_min[i]=heights.size();}else{right_min[i]=st1.top();}st1.push(i);
}
int maxa=0;for(int i=0;i<heights.size();i++)
{maxa=max((right_min[i]-left_min[i]-1)*(heights[i]),maxa);}
return maxa;}
};

85. 最大矩形

矩阵的每一层转换为直方图,传入84题的函数求解:

如果mat[i][j]=0,height[j]=0

如果mat[i][j]=1,height[j]++

class Solution {
public:int maximalRectangle(vector<vector<char>>& matrix) {
int maxa=0;
if(matrix.size()==0)
return 0;
vector<int>height(matrix[0].size(),0);
for(auto i:matrix)
{for(int j=0;j<i.size();j++){if(i[j]=='0')height[j]=0;elseheight[j]++;}maxa=max(maxa,largestRectangleArea(height));
}
return maxa;}int largestRectangleArea(vector<int>& heights) {
//left_min记录左边第一个比heights小的下标,如果没有返回-1
vector<int>left_min(heights);
//right_min记录右边第一个比heights小的下标,如果没有返回-1
vector<int>right_min(heights);stack<int>st;
for(int i=0;i<heights.size();i++)
{while(!st.empty()&&heights[st.top()]>=heights[i])st.pop();if(st.empty()){left_min[i]=-1;}else{left_min[i]=st.top();}st.push(i);
}
stack<int>st1;
for(int i=heights.size()-1;i>=0;i--)
{while(!st1.empty()&&heights[st1.top()]>=heights[i])st1.pop();if(st1.empty()){right_min[i]=heights.size();}else{right_min[i]=st1.top();}st1.push(i);
}
int maxa=0;for(int i=0;i<heights.size();i++)
{maxa=max((right_min[i]-left_min[i]-1)*(heights[i]),maxa);}
return maxa;}
};

单调栈:leetcode 84. 柱状图中最大的矩形/85最大矩形相关推荐

  1. c语言力扣l最大矩形,leetcode 84柱状图中最大的矩形,利用单调栈求解l

    利用单调了栈求解leetcode 84柱状图中最大的矩形 image image 利用单调递增栈的方式来实现,计算发生在每次弹出栈顶的操作过程中 单调递增栈的操作步骤 1.如果栈为空或者栈顶元素比入栈 ...

  2. LeetCode 84. 柱状图中最大的矩形(单调递增栈)

    文章目录 1. 题目 2. 解题 1. 题目 题目链接 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是 ...

  3. java 柱状图 宽度_Java实现 LeetCode 84 柱状图中最大得矩形

    84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的 ...

  4. leetcode - 84. 柱状图中最大的矩形

    给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [ ...

  5. LeetCode 84.柱状图中最大的矩形

    今天还是分享一道才刷过的题目, 柱状图中最大的矩形,这道题根上一篇我分享的接雨水类似,都是可以用双指针,动态规划(双指针加备忘录),单调栈来算 这道题的话三种方法都写了,双指针会超时,优化一下备忘录是 ...

  6. LeetCode 84. 柱状图中最大的矩形(Largest Rectangle in Histogram)

    题目描述: 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定 ...

  7. 单调栈 leetcode整理(三)

    目录 42. 接雨水 思路分析 901. 股票价格跨度 思路 581. 最短无序连续子数组 思路一:排序+双指针 思路二:单调栈 思路三:双指针(最省时) 42. 接雨水 42. 接雨水 给定 n 个 ...

  8. 单调栈 leetcode整理(二)

    目录 为什么单调栈的时间复杂度是O(n) 496. 下一个更大元素 I 方法一:暴力 方法二:单调栈+哈希表 739. 每日温度 单调栈模版解 优化 503. 下一个更大元素 II 单调栈+循环遍历 ...

  9. 单调栈 leetcode整理(一)

    目录 单调栈知识 402. 移掉K位数字 1673. 找出最具竞争力的子序列 316. 去除重复字母(1081. 不同字符的最小子序列) 321. 拼接最大数 单调栈知识 单调栈就是一个内部元素有序的 ...

最新文章

  1. 强化学习笔记:Q-learning :temporal difference 方法
  2. mysql test 映射到实体_将MySql视图映射到JPA Entitites,使用哪个唯一...
  3. 如何在 SAP BTP ABAP 编程环境里直接调用 ABAP On-Premises 系统的 RFC 函数
  4. 死锁产生的原因及条件、如何避免死锁
  5. jQuery刻度尺滚动滑块插件
  6. 9:34 2009-7-28
  7. 潮流配色+定制音效 OPPO Enco X蓝调版真无线降噪耳机解析
  8. Python程序-打印九九乘法表
  9. Java使用IntelliJ IDEA配置Maven并管理一个webapp项目
  10. es6.2.4-ansible部署
  11. 【语音合成】基于matlab语音信号变速【含Matlab源码 565期】
  12. I need to follow my heart
  13. Swager登陆跳转了login登陆页面
  14. c语言皮尔森系数程序,皮尔森相关系数(Pearson correlation coefficient)-Go语言中文社区...
  15. opencv vector matlab,opencv实现 Matlab 寻找峰值函数 findpeaks
  16. android sutdio导入源码教程,《AndroidStudio导入安卓源码-idegen》---可方便查看安卓源代码...
  17. 巴巴运动网商品交易系统的架构
  18. 权力的游戏 第七季高清 BT 下载
  19. 论文<<网站的设计与实现>> 仅供参考
  20. 【 D3.js 高级系列 — 6.0 】 值域和颜色

热门文章

  1. SharePoint2010传入电子邮件
  2. Bailian2721 忽略大小写比较字符串大小(POJ NOI0107-16)【字符串】
  3. Binary GCD algorithm
  4. C++ STL 数据结构与算法 —— 排序
  5. Gibbs 采样定理的若干证明
  6. Matlab Tricks(十一)—— padarray 关于边缘成镜像对称
  7. OpenCV2 图像处理与计算机视觉(一)—— 去除一幅二值化图像中的椒盐噪声
  8. linux 帐号 配置sftp_Linux 下sftp配置之密钥方式登录详解
  9. 时点数列序时平均数_时点数列序时平均数计算方法研究
  10. g++是什么_路由器信号分为2.4G和5G,有什么区别?怎么选?