单调栈——每日温度

这篇博客介绍了如何利用单调栈解决一个计算机算法问题:给定每日气温列表,计算在每一天需要等待多久才能遇到更高的温度。通过逆向遍历并维护一个单调栈,可以有效地找出每个位置后遇到更高温度所需的天数。文章详细解释了算法的实现过程,并提供了C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每日温度

请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        vector<int> res(n, 0);
        std::stack<int> st;
        for(int i = temperatures.size()-1; i>=0; --i)
        {
            while(!st.empty() && temperatures[st.top()]<=temperatures[i])
            {
                st.pop();
            }
            res[i] = st.empty()?0:st.top()-i;
            st.push(i);
        }
        return res;
    }
};

当题目出现「找到最近一个比其大的元素」的字眼时,自然会想到「单调栈」。使用单调栈,逆向遍历,这里保存的值为索引而不是元素值。最终的结果数组需要计算栈顶索引与当前索引的距离。(遍历整个数组,如果栈不空,且当前数字大于栈顶元素,那么如果直接入栈的话就不是 递减栈 ,所以需要取出栈顶元素,由于当前数字大于栈顶元素的数字,而且一定是第一个大于栈顶元素的数,直接求出下标差就是二者的距离。)

### 单调栈算法每日温度问题中的应用 单调栈是一种特殊的数据结构,其核心在于维护一个栈,使得栈内元素保持单调递增或单调递减的顺序[^2]。这种数据结构可以高效地解决一些特定的问题,例如求数组中每个元素的下一个更大元素、每日温度问题等[^1]。 对于每日温度问题,给定一个整数数组 `temperatures`,表示每天的温度,目标是返回一个数组 `answer`,其中 `answer[i]` 表示对于第 `i` 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,则在该位置用 `0` 来代替[^3]。 以下是使用单调栈实现每日温度问题的解决方案: ```python def dailyTemperatures(temperatures): n = len(temperatures) answer = [0] * n # 初始化结果数组 stack = [] # 单调栈,存储索引 for i, temp in enumerate(temperatures): # 当前温度比栈顶索引对应的温度高时,更新结果 while stack and temperatures[stack[-1]] < temp: prev_index = stack.pop() # 弹出栈顶索引 answer[prev_index] = i - prev_index # 计算天数差 stack.append(i) # 将当前索引入栈 return answer ``` #### 解决方案解析 1. **初始化**:创建一个长度为 `n` 的数组 `answer`,并将其所有元素初始化为 `0`。同时创建一个空栈 `stack`,用于存储温度数组的索引。 2. **遍历温度数组**:通过 `for` 循环遍历温度数组 `temperatures`,对于每个温度值 `temp` 和其索引 `i`: - 如果栈不为空且当前温度 `temp` 高于栈顶索引对应的温度,则弹出栈顶索引,并计算天数差,将结果存入 `answer` 数组中。 - 将当前索引 `i` 压入栈中。 3. **返回结果**:最终返回 `answer` 数组,其中包含了每个位置的下一个更高温度出现的天数差。 这种方法的时间复杂度为 O(n),因为每个索引最多只会被压入和弹出栈一次[^4]。空间复杂度为 O(n),主要由栈的空间开销决定。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值