leetcode-739.每日温度
栈和队列
题目详情
给定一个整数数组 temperatures
,表示每天的温度,返回一个数组 answer
,其中 answer[i]
是指在第 i
天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0
来代替。
示例1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例2:
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
示例3:
输入: temperatures = [30,60,90]
输出: [1,1,0]
我的代码:
维持一个单调递减的栈,表示每天的温度,存储日期而非温度,通过下标访问温度即可
我们从左向右遍历温度数组,对于每个日期 p,如果 p 的温度比栈顶存储位置 q 的温度高,则我们取出 q,并记录 q 需要等待的天数为 p − q;
我们重复这一过程,直到 p 的温度小于等于栈顶存储位置的温度(或空栈)时,我们将 p 插入栈顶,然后考虑下一天。
在这个过程中,栈内数组永远保持单调递减,避免了使用排序进行比较。最后若栈内剩余一些日期,则说明它们之后都没有出现更暖和的日期。
class Solution
{
public:
vector<int> dailyTemperatures(vector<int>& temperatures)
{
int n = temperatures.size();
vector<int> ans(n); //存储答案天数,这里已经初始化为0了,所以没有找到更高温度的天数就不用处理了
stack<int> indices; //单调栈存温度的下标 来比较
for (int i = 0; i < n; ++i)
{
while (!indices.empty()) //非空
{
int pre_index = indices.top();
if (temperatures[i] <= temperatures[pre_index]) //遍历到的温度小于栈顶,则将其push进栈从而维持单调递减栈
break;
indices.pop(); //如果是温度大于栈顶了,那么就是找到第几天了,将其出栈
ans[pre_index] = i - pre_index; //并计算几天,存入ans中(这里同样是利用了pre_index来一一对应)
}
indices.push(i); //空了或者新元素小了就push进栈
}
return ans;
}
};
涉及知识点:
1.栈和队列
stack:后入先出(LIFO)的数据结构,默认基于 deque 实现。stack 常用于深度优先搜
索、一些字符串匹配问题以及单调栈问题。
queue:先入先出(FIFO)的数据结构,默认基于 deque 实现。queue 常用于广度优先
搜索。
2.单调栈
单调栈通过维持栈内值的单调递增(递减)性,在整体 O(n) 的时间内处理需要大小比较的问题。