84.直方图中最大的矩形

版权声明:只要梦想一天,只要梦想存在一天,就可以改变自己的处境。 https://blog.csdn.net/dongyanwen6036/article/details/86546608
直方图中最大的矩形

分析:遍历数组,每找到一个局部峰值,然后向前遍历所有的值,算出共同的矩形面积,每次对比保留最大值,代码如下:

class Solution
 {
 public:
	 int largestRectangleArea(vector<int> &height)
	 {
		 int res = 0;
		 for (int i = 0; i < height.size(); i++)
		 {
			 if ((i != height.size() - 1) && height[i] <= height[i + 1])continue;
			 int min_val = height[i];
			 for (int j = i; j >= 0; j--)
			 {
				 min_val = min(min_val, height[j]);
				 int area = min_val*(i - j + 1);
				 res = max(res, area);
			 }
		 }
		 return res;
	 }
 };

[1]思路二:单调栈.那么根据这道题的特点,我们需要按从高板子到低板子的顺序处理,先处理最高的板子,宽度为1,然后再处理旁边矮一些的板子,此时长度为2,因为之前的高板子可组成矮板子的矩形 ,因此我们需要一个递增栈,当遇到大的数字直接进栈,而当遇到小于栈顶元素的数字时,就要取出栈顶元素进行处理了,那取出的顺序就是从高板子到矮板子了,于是乎遇到的较小的数字只是一个触发,表示现在需要开始计算矩形面积了,为了使得最后一块板子也被处理,这里用了个小trick,在高度数组最后面加上一个0,这样原先的最后一个板子也可以被处理了。

  • 峰值可能最大面积的宽度为(i - st.top() - 1)这句话比较难理解(不包括i,也不包括次峰值st.stop()),画个图举几个例子好明白。
class Solution {
 public:
	 int largestRectangleArea(vector<int>& heights) {
		 int n = heights.size();
		 int res = 0;
		 // insert 0 height为了方便最后一个处理
		 heights.push_back(0);
		 stack<int>T;
		 for (int i = 0; i < heights.size(); i++)
		 {
			 if (T.empty() || heights[T.top()] <= heights[i])
				 T.push(i);
			 else
			 {
				 int top = T.top(); T.pop();
				 res = max(res, heights[top] * (T.empty() ? i : (i - T.top() - 1)));
                 i--;
			 }

		 }
		 return res;
	 }
 };

[1]https://www.cnblogs.com/grandyang/p/4322653.html

猜你喜欢

转载自blog.csdn.net/dongyanwen6036/article/details/86546608
今日推荐