单调栈
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。
在使用单调栈的时候首先要明确如下几点:
1.单调栈里存放的元素是什么?可能是存放的数组的下标,也可能是存放的数组的元素。(建议还是存放数组的下标)
2.单调栈里元素是递增呢? 还是递减呢?注意一下顺序为 从栈头到栈底的顺序。
单调栈,栈内顺序要么从大到小 要么从小到大
小tips:如何明确栈内顺序:
首先定义一个栈。读题目,假设从左到右依次进栈,如果栈顶元素大于栈底元素,会产生操作,即会产生answer[i]。所以栈内顺序应该为自顶而下递增,从小到大。
同时明确栈内存储的是下标,而非数组元素。
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int[] arr=new int[temperatures.length];
Stack<Integer> stack=new Stack<>();
for(int i=0;i<temperatures.length;i++){
//因为题目说的后面的值一旦大于前面的值,前面的就可以拿到arr数组里了,肯定不在栈中,所以栈自顶而下的顺序是从小到大的。
while(!stack.isEmpty()&&temperatures[stack.peek()]<temperatures[i]){
int t=stack.pop();
arr[t]=i-t;
}
stack.push(i);
}
return arr;
}
}