84. Largest Rectangle in Histogram (Array; Stack, DP)

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.

法I: 使用stack记录高度。

class Solution {
public:
    int largestRectangleArea(vector<int> &height) {
        if(height.size() == 0) return 0;

        int res = 0;
        stack<int> idxStack;
        height.push_back(0); //为了如果在最后height为最高的情况,能够再进一次else,把stack中的元素pop出来计算

        for(int i = 0; i < height.size(); i++)
        {
            if(idxStack.empty() || (!idxStack.empty() && height[i] >= height[idxStack.top()])) //当前高度>=栈顶高度
                idxStack.push(i); //入栈
            else{ //高度降低了,那么再之后也就不可能超过height[idx],所以看之前的高度*宽度能够达到怎样的值
                while(!idxStack.empty() && height[idxStack.top()] > height[i]) //只要当前高度<栈顶高度
                {
                    int idx = idxStack.top();
                    idxStack.pop();
                    int width = idxStack.empty() ? i : (i-idxStack.top()-1); //当前index-1的位置(目前为止最高高度的位置)到当前栈顶元素的位置的宽度
                    res = max(res, height[idx] * width);
                }
                idxStack.push(i);
            }
        }
        height.pop_back();
        return res;
    }
};

法II: 使用动态规划

class Solution {
public:
    int largestRectangleArea(vector<int> &height) {
        int* l = new int [height.size()]; //状态:向左连续的>=height[i]的最后一个位置
        int* r = new int [height.size()]; //状态:向右连续的>=height[i]的最后一个位置

        l[0]=0;
        for( int i =1; i <height.size(); i++) //从左往右扫描
        {
            if(height[i]==0)
            {
                l[i] = 0;
                continue;
            }
            int j = i-1;
            for(; j >= 0; j--){
                if(height[i] <= height[j]) j = l[j]; //用动态规划求l[i]否则会Time Limit Exceeded
                if(height[i] > height[j]) break;
            }
            l[i] = j+1;
        }
        r[height.size()-1]=height.size()-1;
        for(int i =height.size()-2; i >=0; i--){ //从右往左扫描
            if(height[i]==0)
            {
                r[i] = 0;
                continue;
            }
            int j = i+1;
            for(; j <height.size(); j++){
                if(height[i] <= height[j]) j = r[j]; //动态规划
                if(height[i] > height[j]) break;
            }
            r[i] = j-1;
        }

        int area;
        int largestArea = 0;
        for(int i = 0; i< height.size(); i++)
        {
            area = (r[i]-l[i]+1) * height[i];
            if(area>largestArea) largestArea = area;
        }
        return largestArea;
    }
};
时间: 2024-10-10 11:14:41

84. Largest Rectangle in Histogram (Array; Stack, DP)的相关文章

84. Largest Rectangle in Histogram *HARD* 柱状图求最大面积 85. Maximal Rectangle *HARD*

1. 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 large

【LeetCode】84. 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. Above is a histogram where width of each bar is 1, given height =[2,1,5,6,2,3]. The largest r

84. Largest Rectangle in Histogram *HARD* -- 求柱状图中的最大矩形面积

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

LeetCode OJ 84. 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. Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. The largest

[leedcode 84] 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. Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. The largest

[leetcode]84.Largest Rectangle in Histogram ,O(n)解法剖析

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

LeetCode 84 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. Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. The largest

leetCode 84.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. Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. The largest

Leetcode题解14 84. Largest Rectangle in Histogram(hard)

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