这道题是单调栈的一个经典应用,这里我们使用单调递减的栈(从栈底到栈顶单调递减)来实现,首先我们创建一个与temperatures
大小一致的全0
数组result
,然后我们通过一个for
循环,通过下标访问的方式遍历所有元素,当栈不为空且当前遍历到的元素大于栈顶对应的元素时,我们将result[st.top()]
赋值为i - st.top()
,然后将栈顶元素弹出,注意,这应当是一个持续的过程,因为弹出原来的元素后,新的栈顶对应的温度仍有可能低于当前遍历到的温度,所以我们需要不断地对比和赋值,直到当前温度低于栈顶的温度或栈被清空,则我们才将当前遍历到的下标压入栈中。
当遍历结束后,result
也赋值完成,我们直接将result
返回即可。
class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n = temperatures.size();stack<int> st;vector<int> result(n, 0);for(int i = 0; i < n; i++){//把温度小于temperatures[i]的日期全都找出来,并在对应的位置上标注//该日期与第i天的时间间隔,如果栈清空了,则无需继续统计,直接将其//压入栈中while(!st.empty() && temperatures[st.top()] < temperatures[i]){result[st.top()] = i - st.top();st.pop();}st.push(i);}return result;}
};