单调栈
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了
单调栈用来存放数组中的元素,根据大小关系进行不同的处理
每日温度
在Java 6及更高版本中,官方文档建议使用Deque
接口的实现类ArrayDeque
来替代Stack
类,因为Stack
继承自Vector
,而Vector
由于历史原因存在一些性能和线程安全上的问题。
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int len=temperatures.length;
int[] res=new int[len];
Deque<Integer> s=new LinkedList<>();
s.push(0);//存入的是数组的下标
for(int i=0;i<len;i++){
while(!s.isEmpty()&&temperatures[i]>temperatures[s.peek()]){
int x=s.pop();
res[x]=i-x;
}
s.push(i);
}
return res;
}
}
下一个更大元素
主要需要做一个hash映射,再使用单调栈,单调栈使用是遍历找更大元素的数组
hash来存当前元素和大于这个元素的下一个元素。
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
HashMap<Integer,Integer> map=new HashMap<>();//用来存放元素及大于它的元素
Deque<Integer> stack=new LinkedList<>();
int[] res=new int[nums1.length];
int len2=nums2.length;
stack.push(0);
for(int i=1;i<len2;i++){
while(!stack.isEmpty()&&nums2[i]>nums2[stack.peek()]){
int x=stack.pop();
map.put(nums2[x],nums2[i]);
}
stack.push(i);
}
for(int i=0;i<nums1.length;i++){
res[i]=map.getOrDefault(nums1[i],-1);//如果有就输出大于这个元素的值,没有为-1
}
return res;
}
}