Largest Rectangle in Histogram
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.
大概形如上图所示。5,6构成的就是所求的最大矩形区域。题目简单暴力。
开始先写个朴素的O(N^2)算法,发现果然过不了。。。
其实隐约的感觉到应该是要快速的找出第一个比第 i 位矮的位置在哪里,然后通过(右边的位置减去左边的位置)*height[i] 得到第 i 位的答案,这样答案就在O(N)内可以计算出来。
只要得到了这个window数组,答案就显而易见了。只需求出Max(window[i] * height[i])就可以了。
然后有了一点类似kmp那样重复利用已有信息的想法,可是还是不太清楚具体要怎么实现。
直到手贱点开了tag,看到了其中的stack才恍然大悟。(虽然后面发现不用显示的写出这个栈貌似复杂度也是一样的)
我最初的方法是:
每次进栈的时候直到栈顶不高于当前高度为止弹栈,当前元素的前一个即是栈顶,然后压入当前元素。
复杂度分析:每个位置只会进栈一次出栈一次,再加上刚刚得到最终结果的分析。所以总的复杂度是严格O(N)的,提交发现AC了。
代码如下:
class Solution { public: int largestRectangleArea(vector<int>& height) { stack<int> backward, forward; int *window = new int[height.size()]; for (int i = 0; i < height.size(); i++) { window[i] = 1; } for (int i = 0; i < height.size(); i++) { int j = height.size() - i - 1; while (!forward.empty() && height[forward.top()] >= height[i]) { forward.pop(); } window[i] += forward.empty() ? i : i - forward.top() - 1; forward.push(i); while (!backward.empty() && height[backward.top()] >= height[j]) { backward.pop(); } window[j] += backward.empty() ? height.size() - j - 1 : backward.top() - j - 1; backward.push(j); } int max = 0; for (int i = 0; i < height.size(); i++) max = max < window[i] * height[i] ? window[i] * height[i] : max; return max; } };
时间: 2024-10-20 21:30:47