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