这道题的启示:
(1)不要通过改bug来完成代码;
(2)想透彻再动手;
(3)集中注意力。
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
stack<int> stk;
height.push_back(0);
int maxv,area,first;
if(height.size()==1) return 0;
for(int i =0 ; i< height.size(); ){
if(stk.empty() || height[i]>=height[stk.top()])
stk.push(i++);
else{
while((!stk.empty()) && (height[stk.top()]>height[i])){
first=stk.top();stk.pop();
if(stk.empty()) area=height[first]*(i);//注意这里的 i ,
else area=(i-stk.top()-1)*height[first];
maxv=max(maxv,area);
}
}
}
return maxv;
}
};
一个很好的测试数据:4 2 0 3 2 5
完成测试程序:
<span style="font-size:14px;">#include <iostream>
#include <memory>
#include <cstring>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
int largestRectangleArea(vector<int> &height) {
stack<int> stk;
height.push_back(0);
int maxv,area,first,last;
maxv=0;
if(height.size()==1) return 0;
for(int i =0 ; i< height.size(); ){
if(stk.empty() || height[i]>=height[stk.top()])
stk.push(i++);
else{
while((!stk.empty()) && (height[stk.top()]>height[i])){
first=stk.top();stk.pop();
if(stk.empty()) area=height[first]*(i);
else area=(i-stk.top()-1)*height[first];
maxv=max(maxv,area);
}
}
}
return maxv;
}
int main() {
// your code goes here
vector<int> height;
int n;cin>>n;int tmp;
for(int i=0 ; i<n ; i++) {cin>>tmp;height.push_back(tmp);}
int area = largestRectangleArea(height);
cout<<area<<endl;
return 0;
}</span>