84
以当前这个高度,最大的矩形面积。
单调栈问题??就是单调递增或是单调递减的栈。永远是有序的栈。
如何让所有元素出栈, vector中添加一个不可能的-1, INT_MIN
- 为空或入栈元素值小于栈顶元素值,则入栈;否则,如果入栈则会破坏栈的单调性,则需要把比入栈元素小的元素全部出栈。单调递减的栈反之
stack<int> st;
//此处一般需要给数组最后添加结束标志符,具体下面例题会有详细讲解
for (遍历这个数组)
{
if (栈空 || 栈顶元素大于等于当前比较元素)
{
入栈;
}
else
{
while (栈不为空 && 栈顶元素小于当前元素)
{
栈顶元素出栈;
更新结果;
}
当前数据入栈;
}
}
绝对大神级解析!!!
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> stk;
heights.push_back(-1);
int top =0;
int ans = INT_MIN;
for(int i=0; i<heights.size(); i++){
if(stk.empty() || heights[i]>=heights[stk.top()]){ //如果==可以一直往里面放而且延申
stk.push(i);//放进去的是i而不是height[i]
}else{
while(!stk.empty() && heights[i]<heights[stk.top()]){//
top = stk.top();
stk.pop();
ans = max(ans, heights[top]*(i-top));
}
stk.push(top); //放进去的应该是top,到头的那位
heights[top] = heights[i];//看到最前面那个if没?????????
}
}
return ans;
}
};
果然最后两行stk.push(top),这里top是??让i-top == 真正的宽!!!!因为前边会pop到0,空了,计算面积时它可以向左不停的延申!!!!
42.接雨水
739.
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
stack<int> stk;
vector<int> ans(T.size());
if(T.size()==0) return T;
int top = 0;
for(int i=0; i<T.size(); i++){
if(stk.empty() || T[i] <= T[stk.top()]){//如果递减,我就pop掉,装进去这个
stk.push(i);
}
while(!stk.empty() && T[i]>T[stk.top()]){
top = stk.top();
stk.pop();
ans[top] = i-top;
}
stk.push(i);
}
return ans;
}
};
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
stack<int> stk;
vector<int> ans(T.size());
if(T.size()==0) return T;
int top = 0;
for(int i=0; i<T.size(); i++){
while(!stk.empty() && T[i]>T[stk.top()]){
top = stk.top();
stk.pop();
ans[top] = i-top;
}
stk.push(i); //反正每个都要放进去
}
return ans;
}
};
改进后:超50%