单调性
- 最大矩形
考虑每一列矩形找到向左和向右扩展的最长距离。即左边最近哪一个比他小,右边最近哪一个比他小。于是维护一个单调递增的栈即可。这个元素加入栈时的下一个元素便是比他小的第一个,被某个元素弹出时便是这个元素的右边比他小的数被找到了(当前数比要加入的大)
很多面积问题可以用单调栈来解决。
- 最大01子矩形
做法1:一行一行的做单调栈
做法2:考虑悬线法
对于某个点预处理出往左和往右可以扩展的最大深度,然后从下往上(从上往下也行)计算当前点往下能最大扩展的深度时的往左往右扩展深度把每个点取max即可。类似DP
正确性显然??
- 单调队列
优化DP。需要发现dp的单调性。
- 跳树
发现dp数组时单调不下降的,用单调队列维护满足条件区间的最小值即可。
考虑按照第一关键字dp值第二关键字高度放入单调栈,每次去栈顶更新即可。
滑动窗口
- 理想的正方形/起飞的正方形打野
做法1:直接二维ST表(不会)
做法2:先横向扫每一行每n个元素的最值记录下来。然后再纵向扫秒每一列n个元素的最值即可(新数组)。巧妙的单调队列做法。
做法3:优先队列(堆)暴力维护。由于带一个log可能会被卡O(ablogab)
做法4:dp设f(x,y,z)为以x,y为某个角落边长为z的最值。然而可能会爆空间+O(abn)
- 二分
- 序列二分。在单调数组中找某个值即可二分。
- 二分答案。
答案满足单调性即可使用二分答案。例如当某个值取k时满足条件那么取大于k 的都满足条件。经典的标志性语句是“最大值最小”等
- 牛吃草问题(草)
直接二分答案,很简单。当然这里需要用double来存。这里还需要注意的是相对误差的处理方式,二分的边界和绝对误差不同。
- 三分
求单峰函数的最值。有很多峰的也可以求其中的某一个峰。
每一次三分出两个点,其中小的那个那一边就可以舍去了,大的那边不能舍弃
很多题可能答案会是二次函数可以用它。
求每一段区间的最大值。维护一个单调递减队列即可。元素序号是单调的。
利用单调性优化DP可以直接降低一位复杂度,而使用数据结构则大多带一个log还难写
此外,很多贪心等题目也需要单调性进行解题/优化。因此一定要学会找到题目中的单调性
本文来自博客园,作者:lei_yu,转载请注明原文链接:https://www.cnblogs.com/lytql/p/15003923.html