思路
对于扫描到的当前的温度,要从后往前看是不是比此前每天的温度要高,如果高的话就挨个通知,直到某一天的温度比他高,而且要倒着通知(为什么不正向通知?比如[36,34,33,35]),如果从前往后扫描,当前温度是最后的35,会因为36>34导致通知不到34和33,如果把通知的条件改为从前扫描到现在,那么最坏的情况下时间复杂度会变成O(n²))。如果倒着扫描,我们的局部高温会顺利地通知到它前面的温度比他低的天,基于此我们需要用栈解决问题~
因此我们的栈是一个非递增的,那么通知何时停止? 栈空或者是温度比栈顶低了
最后在通知结束后要把自己也入栈
还有一个注意点在于,因为我们需要计算天数差,所以存的是索引
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int[] highTemperatures = new int[temperatures.length];
Stack<Integer> tempIndex = new Stack<>();
for (int i = 0; i < temperatures.length; i++) {
//温度比栈顶高 就修改栈顶和下方每一个温度 直到栈空或者温度小于栈顶温度
while (!tempIndex.empty() && temperatures[i] > temperatures[tempIndex.peek()]) {
int prev = tempIndex.pop();
highTemperatures[prev] = i - prev;
}
tempIndex.push(i);
}
return highTemperatures;
}
}
Go代码
func dailyTemperatures(temperatures []int) []int {
var stack []int
result := make([]int, len(temperatures))
for i, temperature := range temperatures {
for len(stack) != 0 && temperature > temperatures[stack[len(stack)-1]] {
lowIndex := stack[len(stack)-1]
stack = stack[0 : len(stack)-1]
result[lowIndex] = i - lowIndex
}
stack = append(stack, i)
}
return result
}