1,只有对题目和解法真的知根知底,对算法的每一个运算过程都能在草稿纸上画出来,才算是懂了,为了避免遗忘,最好要记一下笔记。
想要观测到后面几天比今天气温更高的温度得等几天,很明显要使用后进先出的栈。
解法:
1, 使用单调栈对数组for循环。
2,用栈顺序地记录每一个数组元素的索引位置。
3,对于当前遍历的数组元素值C 大于当前栈顶索引所指向的数组元素值B,使用while循环依次弹出小于C的栈顶元素,每弹出一个元素,记录C和栈顶元素值的差值,保存到res数组。
栈顶保持已遍历的数组元素的最大值的索引,因为“要等几天”是求两数组元素索引之差,所以栈里保存的都是索引。
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
Stack<Integer> stack=new Stack<>();
int[] res=new int[temperatures.length];
for(int i=0;i<temperatures.length;i++){
while(!stack.isEmpty()&&temperatures[stack.peek()]<temperatures[i]){
int index=stack.pop();
res[index]=i-index;
}
stack.push(i);
}
return res;
}
}