每次以第i个值为高的最大值,然后取最大值
以第i个值为高的最大值的计算: [i]后面的值大于它时 最大值加上一个[i],小于它时跳出,它前面的值做同样的处理
方法一:想法简单,时间复杂度比较高
int largestRectangleArea(std::vector<int>& heights) {
if(heights.size()==0)
return 0;
int max=0;
for(int i=0;i<heights.size();i++){
int c=heights[i];
for(int j=i+1;j<heights.size();j++){
if(heights[i]>heights[j])
break;
else if(heights[i]<=heights[j])
c=c+heights[i];
}
for(int j=i-1;j>=0;j--){
if(heights[i]>heights[j])
break;
else if(heights[i]<=heights[j])
c=c+heights[i];
}
if(c>max)
max=c;
}
return max;
}
方法2:首先找到某个峰值,之后遍历该峰值之前的数组
int largestRectangleArea(std::vector<int>& heights) {
if(heights.size()==0)
return 0;
int maxArea=0;
for(int i=0;i<heights.size();i++){
if(i+1<heights.size()&&heights[i]<=heights[i+1])
continue;
int minH=heights[i];
int area=0;
for(int j=i;j>=0;j--){
minH=std::min(minH,heights[j]);
area=minH*(i-j+1);
maxArea=std::max(maxArea,area);
}
}
return maxArea;
}
方法3:与方法2的思路类似,只是使用了stack的方式遍历
int largestRectangleArea(vector<int>& heights) {
int res=0;
int cur=0;
stack<int> st;
heights.push_back(0);
for(int i=0;i<heights.size();i++){
while(!st.empty()&&heights[st.top()]>=heights[i]){
cur=st.top();
st.pop();
res=max(res,heights[cur]*(st.empty()?i:(i-st.top()-1)));
}
st.push(i);
}
return res;
}