第一版:超時,雙層循環(huán)淤年。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if(heights.empty())
{
return 0;
}
int result = heights.front();
vector<int> min_record;
for(int i = 0; i < heights.size(); ++i)
{
int min = heights[i];
min_record.clear();
for(int j = i; j < heights.size(); ++j)
{
if(min > heights[j])
{
min = heights[j];
}
min_record.push_back(min);
}
int base = 0;
//result = min_record[base];
for(int j = base + 1; j < min_record.size(); ++j)
{
if(min_record[base] != min_record[j])
{
int buffer = min_record[base] * (j - base);
if(result < buffer)
{
result = buffer;
}
base = j;
}
//如果最小值在最后一位變化钧敞,那么最后一位肯定不會產生最大面積蜡豹,只有一個直方,不會進入此層循環(huán)溉苛。
else if(j == min_record.size() - 1)
{
int buffer = min_record[base] * (j - base + 1);
if(result < buffer)
{
result = buffer;
}
}
}
}
return result;
}
};
看了看tag镜廉,用棧的話,加以優(yōu)化愚战。
Largest Rectangle in Histogram
= =才疏學淺娇唯,沒想出來,貼上所查鏈接寂玲,以及參考所寫代碼如下:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if(heights.empty())
{
return 0;
}
int result = 0;
stack<int> buf_stack;
result = heights.front();
buf_stack.push(heights.front());
for(int i = 1; i < heights.size(); ++i)
{
if(heights[i] >= buf_stack.top())
{
buf_stack.push(heights[i]);
}
else
{
int count;
for(count = 1; !buf_stack.empty() && buf_stack.top() > heights[i]; ++count )
{
result = max(result,count * buf_stack.top());
buf_stack.pop();
}
while(count--)
{
buf_stack.push(heights[i]);
}
}
}
for(int count = 1; !buf_stack.empty(); ++count )
{
result = max(result,count * buf_stack.top());
buf_stack.pop();
}
return result;
}
};
AC塔插!撒花!