题目分析:
- 求条形图中最大矩形的面积,输入为条形图中条的个数和每个条的高度。
解题思路:
双重循环(超时)
找第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; } };