题目:柱状图中最大的矩形
这次与盛最多水的容器非常相似,但不同的的是十一题只需要看两边的木板长度,而这一题需要考虑容器中间的最低高度
1int largestRectangleArea(vector<int>& heights)
2{
3 // 当右边所有矩形都比当前矩形高时
4 // 有可能不会计算以当前矩形为中心的结果
5 // 在末尾设置一个 -1(比任何矩形都要低)
6 // 可以强制触发”heights[right] <= heights[st.top()]“
7 // 计算当前结果
8 heights.push_back(-1);
9 std::stack<int> st;
10 // 同理,这里是为了防止左边都高于右边的情况
11 st.push(-1);
12 int area = 0;
13
14 // 外层循环会对每一个矩形都进行一次 area 的计算
15 for(int right = 0; right < heights.size(); right++)
16 {
17 // 内层循环则定义具体的计算步骤
18 while(1 < st.size() && heights[right] <= heights[st.top()])
19 {
20 // 栈顶代表矩形的高
21 int h = st.top();
22 st.pop();
23 // 栈顶下面的那个数代表左边界
24 int left = st.top();
25 // 计算面积
26 area = std::max(area, heights[h] * (right - left - 1));
27 }
28 // 将当前的右边界作为下一次的左边界
29 st.push(right);
30 }
31 return area;
32}
原文:hard