代码随想录:单调栈
每日温度
|
|
参考了官解:方法二:单调栈
维护一个温度单调递减的栈(使用队列模拟),栈中不直接存温度,而是温度的下标i(这样方便计算两个温度之间的天数间隔)
遍历数组:
-
如果当前temper[i]值小于栈顶元素,则直接将i加入到栈中;
-
如果当前temper[i]值大于栈顶元素,则将其前面小于temper[i]的元素全部弹出栈;
在元素弹出栈时,需要更新每个弹出元素outIndex的res数组值(也就是说,如果某个元素弹出栈了,说明找到了比它温度高的i,则更新res[outIndex]=i-outIndex)。
-
如果栈为空,则直接将i加入到栈中。
|
|
下一个更大元素I
|
|
求nums2数组中下一个大于nums1[i]的元素。
由于我们需要到到nums2数组中去找nums1的元素,所以我们需要将nums1的元素存入map中(key为元素值,value为元素下标)。
然后遍历nums2数组,维护一个单调递减(从栈底到栈顶)的单调栈,遍历元素时,需要判断该元素是否在nums1中存在。
后面维护单调栈的过程就和 每日温度 相同了,栈中存的下标值,而不是元素值。
|
|
下一个更大元素II
|
|
自己的想法: 将nums数组拼接上一个nums数组。
|
|
方法2: 使用%(下标取余)的方式来模拟数组成环的过程。不用真正地去将原数组扩充,而是让下标去循环遍历。
|
|
接雨水
|
|
代码随想录的思路:使用单调栈。
我们需要确定i位置 左边第1个大于它的位置 和 右边第1个大于它的。
我们可以使用最小栈(栈顶元素最小)来完成。
如果遇到的元素小于栈顶元素,直接将其添加到栈中。(添加的是下标)
如果遇到的元素大于栈顶元素,则i位置的右侧边界就找到了,也就是收获结果的时候。
|
|
双指针的思路可以参考:LeetCode 热题 100-接雨水。
柱状图中最大的矩形
|
|
使用单调栈来实现。
在i位置,我们需要找到左边第1个比它小的位置leftIndex和右边第1个比它小的位置rightIndex,i位置的最大宽度就是rightIndex-leftIndex-1。
我们需要维护一个最大栈,也就是栈顶元素最大,栈顶到栈底依次递减(可以相等)。具体如下:
- 如果遇到的元素比栈顶元素大(或者等),则直接将其添加到栈中(添加的是元素的下标);
- 如果遇到的元素比栈顶元素小(右边就不能继续往后延展了),就是我们需要收获结果的时候。
我们计算以栈顶元素stackTop的值为高度,能形成的最大矩形
-
矩形的左侧位置就是栈顶元素stackTop在栈中的前一个位置(比栈顶位置值大)
-
矩形的右侧位置就是我们遇到的元素位置
这样计算一个面积值之后,更新maxArea的值。
然后将栈中比添加元素大的元素全部弹出,将遇到的元素加入到栈中。
|
|