本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第52篇文章,我们一起来看LeetCode第84题,Largest Rectangle in Histogram(最大矩形面积). 这道题的官方难度是Hard,点赞3581,反对只有80,通过率在34.7%左右.从通过率上来看,难度其实还可以,并没有特别大,但是这道题的点赞比很高,说明题目的质量很好.实际上也的确如此,这题非常经典,我个人也非常推荐.建议大家有能力的都做一下本题,一定会很有收获. 题意 假设我们…
先说一个简单的题目(题目大意自己看去,反正中文):hihocoder上的:http://hihocoder.com/problemset/problem/1476 然后因为这个n和m的矩阵范围是1000,所以比较简单 然后我们说一下hihocoder上面的做法,首先,这题的做法是http://www.cnblogs.com/heimao5027/p/6738715.html的简化版本,因为颜色只有两种,所以和前面链接给的做法那样,用单调栈维护一下即可. //看看会不会爆int!数组会不会少了一维…
求01矩阵里有多少个不同的1矩阵 首先预处理出pre[i][j]表示i上面连续的1个数,对每行的高度进行单调栈处理 栈里的元素维护两个值:pre[i][j]和向前延伸最多能维护的位置pos 然后算贡献,从左往右扫时维护一个最靠右下面没有1的列的位置p, 元素在被弹出时判断其pos是否能包含p,如果能说明这个元素代表的矩阵是有贡献的 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<…
题目链接 [题解] 维护一个单调递增的栈. 会发现栈内的第i个元素的前面一个(i-1)元素在原始的序列中的数字 都是要高于第i个元素的.(或者没有元素) 那么第i个元素往左最多可以扩展到第i-1个元素的右边. 那么它的右边界在哪里呢?当然是一直延伸到栈顶元素所在的位置了. 此时如果新加来的元素x一直会小于sta[i] 也即sta[i]只能延伸到i-1那个位置了(原来的栈顶) 这时候就能用sta[i]来更新答案了.即 x元素所在位置-1-第i个元素前面一个元素所在的位置.再乘上第i个元素的高度.…
11. Container With Most Water 题意:取两根求最大体积 思路:使用两个指针分别指向头和尾,然后考虑左右两根: 对于小的那根,如果选择了它,那么能够产生的最大体积一定是当前的情况:因为当前情况体积=这根长度 * 当前距离,以后的话长度一定是左右边界的min,即<=这根长度,距离一定越来越小 因此小的那根以后就不会被选了,因此把小的那根的指针挪动一下 直到指针相遇 class Solution { public: int maxArea(vector<int>&a…
题目是求次大子矩形,那么在求最大子矩形的时候维护M1,M2即可 转移M2时比较的过程要注意一下 #include<bits/stdc++.h> using namespace std; #define maxn 1005 char mp[maxn][maxn]; int n,m,f[maxn][maxn],M1,M2; int stk[maxn],top,w[maxn]; void calc(int i){ top=; f[i][m+]=; memset(w,,sizeof w); ;j<…
原文链接https://www.cnblogs.com/zhouzhendong/p/8682572.html 题目传送门 - BZOJ4237 题意 平面上有$n(n\leq 2\times 10^5)$个整点(坐标范围在$[0,10^9]$之间). 第$i$个点$p_i$的坐标是$(x_i,y_i)$. 如果有一对点$p_i$和$p_j$,满足$x_i<x_j,y_i<y_j$,而且以这两个点为左下角和右上角所围城的矩形内不包含任何整点(边界上面不算),那么他们对答案的贡献为1. 求答案.…
题意 给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次数的操作后,问最大能够选出多长的一个连续子序列,使得这个子序列的每个数都不小于k.M组询问 n<=1000000,m<=50; 题解 这题一开始想的是二分,但瞟了一眼范围觉得会T但是,觉得可以优化,所以就先写二分了. 结果写挂了(不是T是WA了)然后优化也没来得及想就放弃了.(最后我也不知道怎么挂的,能不能用…
最近打了三场比赛疯狂碰到单调栈和单调队列的题目,第一,二两场每场各一个单调栈,第三场就碰到单调队列了.于是乎就查各种博客,找单调栈,单调队列的模板题去做,搞着搞着发现其实这两个其实是一回事,只不过利用了容器内元素单调的不同特性,用来加速处理不同的问题. 单调栈解决的是以某个值为最小(最大)值的最大区间,维护的是左右两边第一个比当前位大或者小的数 单调队列解决的是区间最小(最大)值,维护的是区间内的最值 举个栗子,a[i] = { 1,6,3,5,1,2,4 } 如果容器内数字是单调递减的,最后得…
题目链接:http://poj.org/problem?id=2559 思路:单调栈 什么是单调栈? 单调栈,顾名思义,就是单调的栈,也就是占中存的东西永远是单调(也就是递增或递减)的 如何实现一个单调栈呢?过程很简单.假设栈中已有了若干单调递增的元素,此时我们又有了一个元素,如果这个元素比栈顶元素大,则直接入栈:反之,不断弹出当前元素,直到栈顶元素比之前小为止.(这里实现的是一个单调递增栈,递减栈和递增栈的过程一样) 为什么这道题可以用单调栈? 假设矩形的高度从左到右递增,那么答案是多少?显而…