day3-leetcode739-每日温度
题目描述:

思路
根据标签提示中的“栈”可以想到使用栈来解决这道题
- 同时看到temperatures数组长度很长,但是温度范围只有30-100,故可以考虑使用温度这个维度来进行设计
- 本质是比较温度的大小,想到使用一个递增/递减的栈就可以解决比较大小的问题
- 根据题目要求要找到比当前温度更高的天数,假设栈顶是当前温度,那么新进来的应该是比它小的,即栈顶永远是栈中温度最小的元素,那么如果新来的第i天温度比当前栈顶温度大,则认为他是比栈顶天数温度大且最近的一天,同时由于栈是一个递减栈,所以该天出栈后下一个栈顶可以和当前第i天温度继续比较,第i天更大则栈顶出栈,第i天更小则进栈,直至第i天进栈
- 要输出天数差值,所以栈中以temperatures数组的下标为元素
代码如下:
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int len = temperatures.length;
Deque<Integer> st = new ArrayDeque<>();
int [] answer = new int [len];
for(int i=0;i<len;i++){
while(!st.isEmpty()&&temperatures[i]>temperatures[st.peek()]){
int now = st.pop();
answer[now]=i-now;
}
st.push(i);
}
return answer;
}
}
补充:
刚开始使用Stack对象创建栈,ac后发现效率远不如Deque这个对象,查阅资料后学习到了Stack属于JAVA的遗留类(legacy class),它的所有方法是同步的(进程安全的),但是会大幅降低性能
Deque本质是一个双端队列,支持从两端插入和删除元素(既可栈也可队列),用作栈时,效率更高,无线程安全开销。
这是作为栈时他们和新方法的对比,主要时判断是否为空时方法不一样:



被折叠的 条评论
为什么被折叠?



