「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。
题目描述
请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
思路描述
如果是穷举的话,作为一个O()复杂度,这道题并没有什么难处。然而也可以用更加简单的方式,单调栈。
单调栈顾名思义,就是既满足后进先出,又满足栈内元素单调的数据结构。很多人在理解了单调栈的意思后并不能灵活的使用这个算法解题。不妨用笨方法思考这个问题。
单调栈是单调递增还是单调递减?
本题需要获取每一天要等几天才会有更高的温度。如果单调递增的存,那么73入栈,74入栈,75入栈。71的时候前者出栈。我们确实可以求出73,74有一天才会有更高温度。但是75在一直计算到temperatures[6]=76时依旧不可知。
因此需要单调递减的存。
- 73入栈,
- 73出栈74入栈 获得结果73前面是1天,
- 74出栈75入栈 获得结果74前面是1天,
- 71入栈,
- 69入栈,
- 69出栈71出栈 获得结果69前面是1天,获得结果71前面是2天。72入栈。
- 以此类推。 我们会在出栈时得到他前面还有几天才会出现更高温度
具体实现
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> stk;
int length = temperatures.size();
vector<int> arr(length);
for(int i = 0; i < temperatures.size(); i++){
while(!stk.empty() && temperatures[stk.top()] < temperatures[i]){
int tmp = stk.top();
stk.pop();
arr[tmp] = i - tmp;
}
stk.push(i);
}
return arr;
}
总结
使用单调栈是单调递增还是单调递减? 这种笨方法自然躲避了新手不能灵活使用问题,也在已知题目可用单调栈解的时候可以轻松做出来,但是实际上对学习本身是并不负责的,接下来通过几期同样的单调栈题的解答努力寻找这类题的共性。