leetcode 84.Largest Rectangle in Histogram
这道题是在一堆高度不同的矩阵直方图中寻找到面积最大的矩阵,那么可以考虑的就是找出序列中高度的局部最大值,然后往左边来寻找可能的面积最大值的。
class Solution { public: int largestRectangleArea(vector<int>& heights) { int res=0, n=heights.size(); for(int i=0;i<n;i++){ if(i+1<n && heights[i]<=heights[i+1]) continue; int temp=heights[i]; for(int j=i;j>=0;j--){ temp=min(temp,heights[j]); res=max(res, temp*(i-j+1)); } } return res; } };
还有另外一种做法就是维护一个单调栈的,用于保存一个递增序列类似于上述的寻找局部的峰值的,如果要使得面积最大的话就需要使得连续的矩形的高度更高的,由最低的高度来决定的。
维护一个递增栈,当遇到数字大的时候就进栈了,遇到小于的时候就开始对栈顶元素进行处理的。为了使得最后一个高度也能够被利用到就需要在最后的高度上加上0的。
当栈中的元素为空的时候就说明当前弹出的是目前所有的最小值的,因为始终保持的是栈中的元素都是更小的,并且最后还需要对当前的循环变量进行处理的。
class Solution { public: int largestRectangleArea(vector<int>& heights) { heights.push_back(0); // 使得最后的一个高度也能够被计算 stack<int> st; int n=heights.size(), res=0; for(int i=0;i<n;i++){ if(st.empty() || heights[st.top()]<heights[i]){ st.push(i); }else{ int temp=st.top(); st.pop(); // 这里不能使用i-temp作为长度的,样例如1,2,2或者1,3,2的,因为之前被弹出之后仍旧满足大于的条件可以被接着使用的。始终记住一点就是栈中余下的数都是一定比所弹出的数字要小的, res=max(res, (st.empty())?heights[temp]*i:heights[temp]*(i-st.top()-1)); i--; // 使得当前i的能被重新考虑是否入栈的 } } return res; } };
posted on 2018-09-12 15:10 昔风不止,唯有努力生存 阅读(102) 评论(0) 编辑 收藏 举报