思路:从左往右遍历一遍高度值,在[ 0 , i ]范围内,求以height[ i ]为高度值能取的最大面积,不断更新这个最大面积即为最终结果
以某个柱子作为高度的最大面积如何求?------------------>单调递增栈
举个例子:给定柱子的高度分别为2 1 5 6 2 3
下标在[0,2]的范围内,以5为高的最大面积为5*1 此时维持的单调栈为( 1 ) 1是比5小的第一个元素所在的下标 Area=5*(2-1)
更新完最大面积之后,元素5所在的下标2入栈,此时单调栈的元素为(1,2)
//单调栈(递增)求柱状图最大面积 int largestRectangleArea(vector<int>& heights) { //每个柱子的高度 heights.push_back(0); //单调递增的一个栈,栈保存得是当前柱子高度所在得下标 stack<int> stk; int maxArea = 0; for (int i = 0; i < heights.size(); i++) { //while循环维持单调栈的递增性质, while (!stk.empty() && heights[i] < heights[stk.top()]) { int top = stk.top(); stk.pop(); //不断更新当前高度能取得最大值,面积=当前高度*(当前位置-第一个比当前高度小的柱子坐标) maxArea = max(maxArea, heights[top] * (stk.empty() ? i : (i - stk.top() - 1))); } stk.push(i); } return maxArea; }