1、题目
2、理解题意
例如:
对于输入 73,它需要 经过一天 才能等到温度升高到 74 ,所以对应的结果是 1。
对于输入 74,它需要 经过一天 才能升温到 75 ,所以对应的结果是 1。
对于输入 71,它经过 1 天后温度是 69,没有超过它,经过2天的时候温度升高到 72 ,所以对应的结果是 2 。
对于输入 73,后续 没有温度 可以超过它,所以对应的结果是 0 。
其他思路类似。
3、如何用单调栈实现
单调栈适合的题目:要找到左边或者右边“第一个”比当前位置的数大或者小
单调栈的含义:试着去竭力维护栈内元素的大小是“单调”的。
只要有不单调的,那么就把栈顶的元素反复出栈,并且同时将相应结果存入res,直到又满足单调情况再入栈。
具体步骤的解释可以参考代码注释:
class Solution {
//单调栈适合的题目:要找到左边或者右边“第一个”比当前位置的数大或者小
//
//单调栈的含义:试着去竭力维护栈内元素的大小是“单调”的。
// 只要有不单调的,那么就把栈顶的元素反复出栈,并且同时将相应结果存入res,直到又满足单调情况再入栈。
//
public int[] dailyTemperatures(int[] temperatures) {
Deque<Integer> stack = new LinkedList<>();
int len = temperatures.length, index = 0;
int[] res = new int[len];
//维护一个从底到顶降序的单调栈。一旦不是升序,说明此元素比上一个小,满足题意,出栈并记录结果:
for(int i = 0; i < len; i++){
while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]){//temperatures[i]比栈顶的元素还要大,说明找到了
//之所以用while,是因为可能出栈以后的栈顶元素仍然小于temperatures[i],继续记录结果。
//直到temperatures[i]放入栈中仍然满足单调栈,才可以放入stack,这就是单调栈的含义!
int target_index = stack.pop();//找到了,那就把结果pop出去。
res[target_index] = i - target_index;//存入结果
}
stack.push(i);
//temperatures[i]比上一个元素小了,或者栈都空了,这个时候可以push进stack,为单调栈。
}
return res;
}
}