代码随想录算法训练营day49|单调栈

单调栈的题目不多,因此写作一篇博客。

单调栈的定义:一个栈内元素是递增或递减的栈。c++中没有这种特性的容器,所以需要我们手动维护这个栈。用单调栈求某个元素的最近的比该元素大(或小)的元素很方便。

739每日温度

这题是单调栈的入门题目,题目很直接地给出了要求比当天温度更大的日期,因此考虑采用单调栈。因为这题要求的是最近的比该元素大的元素,因此采用递增栈。从头开始遍历,分三种情况讨论:一是当遍历到的元素比栈顶的元素小时,不合题意,将该元素入栈;二是当遍历到的元素和栈顶元素相同时,不合题意,将该元素入栈;当遍历到的元素比该元素大时,符合题意,这时应该比对栈顶元素和遍历到的元素的大小,若符合题意则将栈中元素弹出,直到栈里没有比遍历到的元素更小的元素为止,这时将遍历到的元素入栈。另外为了保证数值与数组下标一一对应的关系,我们选择将数组下标入栈并用数组哈希映射找到数值,这样可以避免重复。

代码随想录

496.下一个更大元素 I 代码随想录

503.下一个更大元素II代码随想录

这两题和739每日温度差不多,区别在于496下一个更大元素I多了一个用unordered_map查找的操作

42接雨水

面试经典题,此题有双指针和单调栈两种解法,时间复杂度都是O(n),双指针法是竖着求每一列的雨水,比较好理解,单调栈是横着求每一行的雨水,比较难想到。双指针法相比于for循环暴力遍历优化的地方在于先用两个数组提前记录下遍历到的位置左边和右边的最大值。而求最大值的过程也很巧妙,运用了dp的思想,

for(int i=1;i<nums.size();i++) maxleft[i]=max(maxleft[i-1],nums[i]);
//最大值由前一个最大值和当前遍历到的数推导而来

单调栈的解法就和739每日温度差不多了,区别就是这题还需要左边的最大值,怎么获得左边的最大值呢?可以取栈顶的下一个元素,这就是左边的最大值

84柱状图中的最大矩形

这题和42接雨水很像,这题的思路是以当前遍历到的元素的值为矩形的高,查找下一个比当前遍历到的元素小的元素。比较不同的是这题是递减栈,而且这题需要在首尾各加一个0(为了避免单调增数列和单调减数列的情况)代码随想录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值