您的位置:首页 > 其它

leetcode_084 Largest Rectangle in Histogram

2016-04-07 23:10 375 查看
题目分析:

求条形图中最大矩形的面积,输入为条形图中条的个数和每个条的高度。

解题思路:

双重循环(超时)

找第i个条左边和右边连续的不低于条的个数,然会计算面积,从而得最后结果

利用栈的思想求解

计算第i个条件图对应的矩形面积,需要知道它连续的左边有多少个条的高度不低于它,假设有a个;同时需要知道它右边多少个连续的条的高度不低于它,假设有b个,此时第i条对应的最大矩形面积为 hi * (a + b + 1)。

实现程序

class Solution
{
public:
//方法1:双重循环进行求解(超时)
int largestRectangleArea1(vector<int> &height)
{
int max_area = 0;
for (int i = 0; i < height.size(); i++)
{
int t = height[i];
int j = i - 1;
int k = i + 1;
int temp_area = height[i];
// 找前面连续的不低于height[i]的位置
while (j >= 0)
{
if (height[j] >= height[i])
{
temp_area += height[i];
j--;
}
else
break;
}
// 找后面连续的不低于height[i]的位置
while (k <= height.size() - 1)
{
if (height[k] >= height[i])
{
temp_area += height[i];
k++;
}
else
break;
}
if (max_area < temp_area)
{
max_area = temp_area;
}
}
return max_area;
}
// 计算最大值函数
int Max(int a, int b)
{
return a > b ? a : b;
}
// 方法2:利用栈进行求解
int largestRectangleArea(vector<int> &height)
{
height.push_back(0);
// 记录当前第i位置对应连续不低于height[i]的最前位置
stack<int> stack;
int i = 0;
int maxArea = 0;
while (i < height.size())
{
// 当栈为空,或栈中元素位置的高度低于当前高度,更行第i位置对应的前面连续不低于height[i]的位置,不进行计算面积
// 只要连续递增,就一直进栈
if (stack.empty() || height[stack.top()] <= height[i])
{
// 次数当前位置进栈,同时i移动位置
stack.push(i++);
}
else   // 计算面积
{
int t = stack.top();   // 取出栈顶元素
stack.pop();
// 计算面积,并更新最大面积
maxArea = Max(maxArea, height[t] * (stack.empty() ? i : i - stack.top() - 1));
}
}
return maxArea;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode