[leetcode-84]Largest Rectangle in Histogram(c++)
来源:互联网 发布:沙丁鱼流量软件 编辑:程序博客网 时间:2024/04/30 20:38
问题描述:原题链接
分析:我之前做过这道题,但是无意间看到网上的一种做法,实在是拍案叫绝,爱不释手,第一个发明这个解法的大神,请收下我的膝盖。
这道题很明显是用栈的结构,但是这里面有几个小问题,就是怎么确定柱的边界。这里是指左右延伸的边界,我的做法太丑就不赘述了,它的做法是维护一个栈,一个高度值从低到高的栈(而且维护的是索引)。那么当某个元素要出栈时,那么高度自然就是该元素本身的高度。
那么讨论宽度,因为栈维护的是一个单调递增的一个索引序列,所以我们可以肯定,当前出栈元素的前一个元素的值一定小于当前值,但是在height数组里面,前一个元素的下一个元素一定大于或等于当前值。这样左边界就找到了。(stack.top()+1),那右边界呢?同理,既然要出栈,当前比较的元素一定小于当前待出栈元素,那么当前比较元素的前一个一定大于(如果小于,早就出栈了)。那么右边界也就确定了:i-1。这样整个的宽度就是:(i-1)-(stack.top()+1)+1 = i-stack.top()-1;慢着,有bug,stack.top(),如果是空的呢?如果是空的,相当于,当前元素是从0到i这些元素中的最小值。那么左边界自然就是0,右边界为i-1,宽度为i了。
另外,一个让我觉得特别牛叉的地方就是:一般当用栈进行完之后,就退出了循环,然后再while(!stack.empty()),再来一遍。但是这位大牛,事先向height中添加了一个最小值0,这样当进行到最后一个时,栈中所有的元素都会弹出。这样就没有了外层的while循环。(赞赞赞)
代码如下:24ms
class Solution {public: int largestRectangleArea(vector<int>& height) { height.push_back(0); int length = height.size(); stack<int> stack; int max = 0; int i = 0; while(i<length){ if(stack.empty()||height[stack.top()] < height[i]){ stack.push(i++); }else{ int index = stack.top(); stack.pop(); int area = height[index]*(stack.empty()?i:i-stack.top()-1); if(area>max) max = area; } } return max; }};
0 0
- [leetcode-84]Largest Rectangle in Histogram(c++)
- 【C++】LeetCode 84. Largest Rectangle in Histogram
- [leetcode 84] Largest Rectangle in Histogram
- 【LeetCode】[84] Largest Rectangle in Histogram
- leetcode || 84、Largest Rectangle in Histogram
- LeetCode---(84)Largest Rectangle in Histogram
- 【Leetcode】Largest Rectangle in Histogram #84
- leetcode 84 :Largest Rectangle in Histogram
- leetcode 84: Largest Rectangle in Histogram
- LeetCode(84) Largest Rectangle in Histogram
- leetcode 84 Largest Rectangle in Histogram
- LeetCode 84 Largest Rectangle in Histogram
- leetcode 84 Largest Rectangle in Histogram
- Leetcode 84 Largest Rectangle in Histogram
- LeetCode No.84 Largest Rectangle in Histogram
- LeetCode 84 Largest Rectangle in Histogram
- leetcode 84 Largest Rectangle in Histogram
- [Leetcode] #84 Largest Rectangle in Histogram
- java笔记--关于线程同步(5种同步方式)
- 剑指offer刷题之java实现的从上往下打印二叉树
- 白话空间统计之五:空间关系的概念化(下)
- Java反射机制之方法反射的基本操作
- Spring MVC 直接返还HTML视图
- [leetcode-84]Largest Rectangle in Histogram(c++)
- html 学习2
- Nim中文件IO
- java 实现线程同步的方式有哪些
- 火星A+B
- 欢迎使用CSDN-markdown编辑器
- Java转换流2
- TCP/IP协议学习之四(DNS协议)
- 设计模式--责任链模式