LeetCode Largest Rectangle in Histogram

来源:互联网 发布:中国书画网络频道 编辑:程序博客网 时间:2024/04/28 07:22

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.



自己写了一个,结果超时了,还是贴一下,也是一种思路:
#include <iostream>#include <string>#include <vector>#include <assert.h>using namespace std;class Solution {public:    int largestRectangleArea(vector<int> &height) {        int len = height.size();                if(len == 0)            return -1;        int min = 0;        int maxArea = 0;                recursion(height, 0, len - 1, maxArea);        return maxArea;    }    void recursion(vector<int> &ivec, int L, int R, int &maxArea)    {        if(L > R)            return;        int i = CalArea(ivec, L, R, maxArea);        recursion(ivec, L, i - 1, maxArea);        recursion(ivec, i + 1, R, maxArea);    }    int CalArea(vector<int> &ivec, int L, int R, int &maxArea)    {        assert(L <= R);                int min = ivec[L];        int k = L;        for(int i = L + 1; i <= R; ++i) {            if(ivec[i] < min) {                min = ivec[i];                k = i;            }        }                int area = min * (R - L + 1);        if(area > maxArea)            maxArea = area;        return k;    }};int main(void){    vector<int> ivec = {2,1,5,6,2,3};    Solution ss;    int ret = ss.largestRectangleArea(ivec);    cout << ret << endl; }

参考: http://blog.csdn.net/doc_sgl/article/details/11805519   一个使用栈的方法

class Solution {public:    int largestRectangleArea(vector<int> &height) {           if(height.size() == 0)            return 0;        height.push_back(0);                stack<int> istack;        int maxArea = 0;        int i = 0;                while(i < height.size()) {            if(istack.empty() || height[i] >= height[istack.top()]) {                istack.push(i++);            }            else {                int t = istack.top();                istack.pop();                maxArea = max(maxArea, height[t] *                         (istack.empty() ? i : i - istack.top() - 1));            }        }        return maxArea;    



0 0