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

网站制作首选 新鸿儒seo公司排名

网站制作首选 新鸿儒,seo公司排名,代运营服务方案,专做排名的网站84.柱状图中最大的矩形 题目要求:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 思路 单调栈 本地单调栈的解法和接雨水的题目是遥相呼…

84.柱状图中最大的矩形

题目要求:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

思路 

单调栈

本地单调栈的解法和接雨水的题目是遥相呼应的。

为什么这么说呢,42. 接雨水 (opens new window)是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。

这里就涉及到了单调栈很重要的性质,就是单调栈里的顺序,是从小到大还是从大到小

在题解42. 接雨水 (opens new window)中我讲解了接雨水的单调栈从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。

那么因为本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序!

我来举一个例子,如图:

只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。

所以本题单调栈的顺序正好与接雨水反过来。

此时大家应该可以发现其实就是栈顶和栈顶的下一个元素以及要入栈的三个元素组成了我们要求最大面积的高度和宽度

理解这一点,对单调栈就掌握的比较到位了。

除了栈内元素顺序和接雨水不同,剩下的逻辑就都差不多了,在题解42. 接雨水 (opens new window)我已经对单调栈的各个方面做了详细讲解,这里就不赘述了。

主要就是分析清楚如下三种情况:

  • 情况一:当前遍历的元素heights[i]大于栈顶元素heights[st.top()]的情况
  • 情况二:当前遍历的元素heights[i]等于栈顶元素heights[st.top()]的情况
  • 情况三:当前遍历的元素heights[i]小于栈顶元素heights[st.top()]的情况

每一次入栈新元素时,我是一直向左边比较比我小的柱子,计算面积并且更新result的。这个思路好神奇我还是没有太想明白中间在while中一直在pop是怎么继续比较的。我个人认为一直在计算的是以每一个i为结尾(right)能够组成的最大矩形长度,这样理解就对了。因为如果当前的i对应的值是2,之前有5,6。即便2之后在出现6,由于2存在的原因也无法组成以5、6为高度的矩形了,所以2能够pop掉2之前所有比2大的st.top()。

class Solution {
public:int largestRectangleArea(vector<int>& heights) {int result = 0;stack<int> st;heights.insert(heights.begin(), 0);heights.push_back(0);st.push(0);for (int i = 1; i < heights.size(); ++i) {if (heights[i] > heights[st.top()]) {st.push(i);} else if (heights[i] == heights[st.top()]) {st.pop();st.push(i);} else if (heights[i] < heights[st.top()]) {while (!st.empty() && heights[i] < heights[st.top()]) {int mid = st.top();st.pop();if (!st.empty()) {int left = st.top();int right = i;int w = right - left - 1;int h = heights[mid];result = max(result, w * h);cout << mid << ' ' << left << ' ' << right << ' ' << w << ' ' << h << ' ' << result << endl;}}st.push(i);}}return result;}
};

细心的录友会发现,我在 height数组上后,都加了一个元素0, 为什么这么做呢?

首先来说末尾为什么要加元素0?

如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。 如图:

那么结尾加一个0,就会让栈里的所有元素,走到情况三的逻辑。

开头为什么要加元素0?

如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。

(mid、left,right 都是对应版本一里的逻辑)

因为 将 8 弹出之后,栈里没有元素了,那么为了避免空栈取值,直接跳过了计算结果的逻辑。

之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 8 进行比较,周而复始,那么计算的最后结果resutl就是0。 如图所示:

所以我们需要在 height数组前后各加一个元素0。

结束啦,今天就是算法训练营的Day60!

http://www.mmbaike.com/news/62922.html

相关文章:

  • wordpress评论优化插件网站优化费用报价明细
  • 软件开发公司网络安全管理制度杭州seo联盟
  • 用手机做网站好学吗创建自己的网页
  • 哈尔滨市建设工程招标网流程优化的七个步骤
  • 黄山网站建设公司拼多多关键词优化是怎么弄的
  • 龙岗网站建设需要考量些什么每日舆情信息报送
  • 网站申请支付宝支付班级优化大师使用指南
  • 网站管理助手ftp连接不上免费发外链的网站
  • 苏州哪家做网站便宜大片网站推广
  • 网站建设专业性优化方案模板
  • 营销型网站建设一般包含哪些内容最佳bt磁力搜索引擎
  • windows wordpress mi新的seo网站优化排名 网站
  • wordpress调用幻灯片百度seo效果
  • 做pc端网站市场视频剪辑培训班一般学费多少
  • 上海建站网络公司五种新型营销方式
  • 专门做设计的网站seo优化师就业前景
  • 网站建设论文附录怎么写优化营商环境心得体会1000字
  • 论坛网站建设价格seo策略
  • 桐庐网站制作营销网站做的好的公司
  • 深圳 网站建设培训自己怎么开发app软件
  • 网站建设小故事网站制作网站推广
  • 郑州平面设计公司排行榜自动seo优化
  • java做网站和asp做网站六年级上册数学优化设计答案
  • 张家港网站建设服务google推广技巧
  • 网站收录差网站seo推广招聘
  • 做什麽网站有前景搜索大全
  • 易龙天做的网站怎么样关键词优化的策略
  • vi手册模板60页网络优化的工作内容
  • 武汉网站制作好百度搜索引擎优化相关性评价
  • 有关建设旅游网站的公司广州 关于进一步优化