https://leetcode.com/problems/largest-rectangle-in-histogram/
O(2n) 至少做过两次,一次是清华的机考准备的时候,一次是ACM的时候,现在仍然想了挺久没搞定,,,,
其实问题就是找一个StartIdx 和EndIdx 看两个idx之间的面积。
关键点在于:考虑“峰”的面积,并且两边不去计算。。。具体看这里的详解:
http://www.cnblogs.com/felixfang/p/3676193.html
http://www.cnblogs.com/avril/archive/2013/08/24/3278873.html
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <stack>
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
heights.push_back(0);
stack <int> sta;
//sta.push_back(0);
int ret=0;
for( int i=0; i<heights.size(); i++ ) {
while( !sta.empty() && heights[sta.top()]>heights[i] ) {
int idx = sta.top();
sta.pop();
int width = sta.empty()? i : (i-sta.top()-1);
ret = max( ret, heights[idx]*width );
}
sta.push(i);
}
return ret;
}
};
int main() {
freopen("84.txt", "r", stdin);
int n;
while( cin >> n ) {
int in;
vector <int> nums;
for( int i=0;i<n;i++ ) {
cin >> in;
nums.push_back(in);
}
Solution s;
cout << s.largestRectangleArea(nums) << endl;
}
return 0;
}