Hot100——739.每日温度

解题思路

本题的解题思路其实是需要用到单调栈。

本题中用到的是单调递减栈,那我们如何来进行使用呢?

以所给示例进行分析:

temperatures = 73, 74, 75, 71, 69, 72, 76, 73,输出应该是 1, 1, 4, 2, 1, 1, 0, 0

首先构造一个空栈(切记栈中存储的是数组元素的下标)

遍历temperatures数组,将第一个数73的下标置于栈顶,而后比较temperatures数组中每一个元素与栈顶元素的大小,

倘若当前数组元素的大小是大于当前栈顶元素的话,则不入栈,因为此时不符合递减栈的要求,需要弹出栈顶元素,直到当前数组元素是小于栈顶元素,满足单调栈的条件,此时求出相应的下标差就是对应的距离。

举例如下:

设栈为st

1.st为空,遍历temperatures数组,将数组的第一个元素的下标压入堆栈,记st0 = 0;

此时的堆栈:0

2.i=1,取temperatures1=74,74>73,此时若是压入栈则不满单调栈的条件,因此弹出栈顶元素,计算二者的下标差就是题中所求。所以res0 = 1 - 0 = 1;而后把当前数组元素的下标压入栈中。

此时的堆栈:1

3.i=2,取temperatures2=75,75>74,与2一致,弹出栈顶元素,将当前数组元素下标存入堆栈中,因此res1 = 2 - 1 = 1;

此时的堆栈:2

4.i=3,取temperatures3=71,71<75,当前数组元素大小小于栈顶元素,满足单调递减栈,存入堆栈,此时栈顶元素是3;

此时的堆栈:2 3

5.i=4,取temperatures4=69,69<71,与4一致,此时栈顶元素是4;

此时的堆栈:2 3 4

6.i=5,取temperatures5=72,72>69,与2一致,弹出当前栈顶元素,记录res4 = 5 - 4 = 1;

继续比较72 > 71,与上述一致,res3 = 5 - 3 = 2;

继续比较,72 <75,满足单调递减栈,压入堆栈,栈顶元素是5;

此时的堆栈:2 5

7.i=6,取temperatures6=76,76>72,弹出栈顶元素,res5 = 6 - 5 = 1;

继续比较76>75,弹出栈顶元素,res2 = 6 - 2 = 4;

将76存入堆栈,栈顶元素是6;

此时的堆栈:6

8.i=7,取temperatures7=73,73<76,满足单调栈,更新栈顶元素,为7。

此时的堆栈:6 7

遍历结束。

以上便是总体流程。

代码

C++

cpp 复制代码
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        vector<int> result(n,0);
        stack<int> st;
        for(int i=0; i<n; i++)
        {
            while(!st.empty() && temperatures[i] > temperatures[st.top()])
            {
                auto t = st.top();
                st.pop();
                result[t] = i - t;
            }
            st.push(i);
        }
        return result;
    }
};

python

python 复制代码
class Solution(object):
    def dailyTemperatures(self, temperatures):
        """
        :type temperatures: List[int]
        :rtype: List[int]
        """
        length = len(temperatures)
        stack = []
        res = [0]*length
        for i in range(length):
            while stack and temperatures[i] > temperatures[stack[-1]]:
                t = stack.pop()
                res[t] = i - t
            stack.append(i)
        return res

参考

LeetCode 图解 | 739.每日温度

相关推荐
zyl76515 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖18 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌18 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F19 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791319 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
tomwang032219 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!19 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
by2099919 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表
2501_9269783320 小时前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作
行者全栈架构师20 小时前
【鸿蒙心迹】互动卡片全链路——把核心功能放到桌面(FormKit 实战)(HarmonyOS 7.x)
前端·算法·架构