一、题目描述
https://leetcode.cn/problems/daily-temperatures/

二、解题思路分析
先介绍一下什么是单调栈:
刚好与这道题完美契合,所以核心思想:单调栈
对每个元素,快速找到它右边第一个比它大的元素的位置
使用栈的原因:
栈可以保存“尚未找到答案”的元素下标;
利用单调性减少无效比较。
单调规则:
我们维护一个从栈底到栈顶单调递减的栈(存储的是下标)。因为只要当前温度比栈顶高,就能“解决”栈顶的问题;否则当前温度也暂时无解,入栈等待。
因此,代码如下:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
//使用一个栈进行元素缓存。找右边第一个比它大的,栈中元素单调递增(从头到尾的顺序)。
//第一个元素可以直接入栈
//遍历一个元素使用该元素与栈顶元素进行比较。如果当前元素比栈顶小就直接入栈。
//如果当前元素比栈顶元素大,说明当前栈顶的元素找到了一个右边第一个比它大的数。这时候需要记录栈顶元素所需要的信息,记录完后删除栈顶元素。然后继续判断栈中元素直到当前元素放入栈中后符合单调递减。
stack<int>stk;
vector<int>res(temperatures.size());
if(temperatures.size()<1) return res;
stk.push(0);
for(int i=1;i<temperatures.size();i++){
if(!stk.empty()&&temperatures[i]<=temperatures[stk.top()]){
stk.push(i);
}
else{
while(!stk.empty()&&temperatures[i]>temperatures[stk.top()]){
res[stk.top()]=i-stk.top();
stk.pop();
}
stk.push(i);
}
}
return res;
}
};
这道题第一次接触还是有一些难度的,有一些细节还需要注意一下
1.栈中存的是下标,不是温度值。这个一开始我存的是温度值,但最后结果需要返回下标时我发现无法找到对应温度值的下标,但如果栈存下标的话,则可以通过下标找到温度值以此比较。
2.初始化结果数组为 0,未被更新的位置自然就是 0(无需额外处理)
3.while 循环条件不能漏 !stk.empty() 这个一定要注意空栈的问题,while循环处理很容易就会空栈,这时候如果使用了top()就会出错了
4.单调方向容易混淆
找“右边第一个更大的” → 单调递减栈
找“右边第一个更小的” → 单调递增栈
1301

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



