Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.算法
Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]
.数组
The largest rectangle is shown in the shaded area, which has area = 10
unit.网络
For example,
Given height = [2,1,5,6,2,3]
,
return 10
. 学习
题目分析:spa
题意很是清楚,就是寻找直方图中的最大矩形面积。code
看似很是简单,最早想到的方法就是穷举法,从头开始日后寻找,或者经过剪枝肯定可能的右边界向前寻找,时间复杂度O(n2)。这个算法显然在数据不少或者递增递减的图中会挂掉。blog
根据助教的提示,下面考虑使用栈:博客
经过观察能够发现,矩形必定在夹在两个较小的矩形的中间,并且必定有矩形右边的元素高度小于矩形最左端的元素的高度,例如上图中高度2小于矩形最左端高度5。it
也就是说计算的矩形必定是一个相似”波峰“的形状。io
从而咱们能够从头遍历集合,当遇到大于当前栈顶元素高度的元素时,进栈;不然,依次出栈,直到栈顶小于等于当前高度,计算面积。并将当前元素压入栈内。
此解法的核心思想为:一次性计算连续递增的区间的最大面积,而且考虑完成这个区间以后,考虑其前、后区间的时候,不会受到任何影响。也就是这个连续递增区间的最小高度大于等于其前、后区间。
代码以下:
class Solution { public: int largestRectangleArea(vector<int>& height) { stack<int> index_height; height.push_back(0); //加入立柱0,做为结尾判断 int area = 0; for (int i = 0; i < height.size(); i++) { if (index_height.empty() || (!index_height.empty() && height[i] >= height[index_height.top()])) //若是比栈顶的高度大,则进栈,构建单调栈 index_height.push(i); else { //比栈顶的高度小,开始依次出栈,并记录下标 while (!index_height.empty() && height[index_height.top()] > height[i]) { int index = index_height.top(); index_height.pop(); int width = index_height.empty() ? i : (i - index_height.top() - 1); //计算弹出的面积 area = max(area, height[index] * width); } index_height.push(i); // 将当前进栈 } } return area; } };
提交到OJ,能够AC经过。但发现广泛C语言的程序速度更快,想了很久,觉得有什么更好地方法。后来想到,C语言里没有用栈,直接顺序存储的数组访问起来更加快。 0.0
此博客中的内容均为原创或来自网络,不用作任何商业用途。欢迎与我交流学习,个人邮箱是lsa0924@163.com