单调栈。
单调栈
判别是否需要使用单调栈,如果需要找到左边或者右边第一个比当前位置的数大或者小,则可以考虑使用单调栈;单调栈的题目如矩形米面积等等
来源739官解评论区
stack存数组的下标。
1 | Deque<Integer> stack = new LinkedList<Integer>(); |
思路是while(栈不空&&当前温度大于栈顶温度),计算ans[],栈顶出栈。
1 | int length = temperatures.length; |
496. 下一个更大元素 I 单调栈+哈希
1 | Deque<Integer> stack = new ArrayDeque<>(); |
ArrayDeque是Deque接口的一个实现,使用了可变数组,容量上没有限制。
1 | Map<Integer, Integer> map = new HashMap<Integer, Integer>(); |
503. 下一个更大元素 II 单调栈+循环数组
循环数组实际上就是将前n - 1个元素拼接到原数组后面,i % n (pusu)
这题是类似每日温度的题,要用到preIndex,
1 | int n = nums.length; |
有左墙右墙和低洼就可以接雨水,比当前位置高的第一个位置,就是右墙。参考题解评论区,写的非常清楚。
1 | public int trap(int[] height) { |
理解题意,可以枚举高度和枚举宽度。枚举高度时,是当前位置i向左向右延伸,找到第一个低于height[i]的位置,right[i]和left[i],两者之间的长度就是矩形的宽。因为是找左右第一个比当前位置小的数,可以用到单调栈。优化之后可以一次遍历找到左右的位置。
1 | int n = heights.length; |