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) 的时间内处理需要大小比较的问题。

posted @ 2022-04-26 10:24  ggaoda  阅读(10)  评论(0编辑  收藏  举报  来源