Leetcode84, 739

84

以当前这个高度,最大的矩形面积。

https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/bao-li-jie-fa-zhan-by-liweiwei1419/

单调栈问题??就是单调递增或是单调递减的栈。永远是有序的栈。

如何让所有元素出栈, vector中添加一个不可能的-1, INT_MIN

  • 为空入栈元素值小于栈顶元素值,则入栈;否则,如果入栈则会破坏栈的单调性,则需要把比入栈元素小的元素全部出栈。单调递减的栈反之
stack<int> st;
//此处一般需要给数组最后添加结束标志符,具体下面例题会有详细讲解
for (遍历这个数组)
{
	if (栈空 || 栈顶元素大于等于当前比较元素)
	{
		入栈;
	}
	else
	{
		while (栈不为空 && 栈顶元素小于当前元素)
		{
			栈顶元素出栈;
			更新结果;
		}
		当前数据入栈;
	}
}

https://blog.csdn.net/lucky52529/article/details/89155694?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=1331997.414.16188415151958213&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

绝对大神级解析!!!
 

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,空了,计算面积时它可以向左不停的延申!!!!

Leetcode84, 739

42.接雨水

 

739.

Leetcode84, 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%

 

上一篇:剑指 Offer 07. 重建二叉树


下一篇:题解[yLOI2018] 锦鲤抄