首页 > 其他分享 >739. 每日温度(leetcode)

739. 每日温度(leetcode)

时间:2024-09-15 16:47:44浏览次数:8  
标签:容器 遍历 int 每日 元素 栈顶 739 leetcode 单调

https://leetcode.cn/problems/daily-temperatures/description/

经典单调栈,关键难点在于如何利用单调栈这个数据结构解题
题意要求向右找到第一个比当前大的元素,若是暴力则是O(n^2),但是依据暴力的这个思想
可以利用单调栈优化,因为求右边第一个比当前元素大的元素,等价于求当前元素是否是之前左边遍历过的第一次遇见的大值
因此使用容器存储之前遍历过的元素,每次遍历当前元素,都从容器中取出一一比较即可知道答案,若发现是大值,则容器中的元素就可以减少一个,不用再继续比较
若未发现大值,则当前遍历的元素也是需要等待寻找答案,因此加入容器
但是若是单纯使用一个普通容器存储,(当特殊情况,比如数据严格倒序)则与暴力没什么区别,由于是比较大值,使用有序的容器,比如单调栈
且单调递增,每次比较都和栈顶元素比较,栈顶元素是最小的,也是最容易得到答案的,而不需要像普通容器一样不断地去遍历整个容器,比如若当前遍历元素比容器中都要小
若使用普通容器,则需要O(n)来比较,但是若是单调栈则O(1)即可,这里就实现了暴力O(n^2)的优化

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        // 经典单调栈
        // 核心思想就是及时去除无用数据,保证栈中数据有序
        // 从左到右,栈中存放此前遍历过的元素下标,每遍历到一个元素,就与栈顶元素进行比较
        // 由于栈中是单调不严格递增的(从栈出口往里的顺序),栈顶元素是最小的,每次就与栈顶元素比较即可
        // 若遍历到的元素比栈顶元素大,则遇见了栈顶元素右边第一个比它大的值,记录答案,出栈,继续比较栈顶元素,直到小于栈顶元素为止
        // 若比栈顶元素小,则未找到答案,则入栈即可
        // 官方题解是这样解释的:由于单调栈满足从栈底到栈顶元素对应的温度递减,因此每次有元素进栈时,会将温度更低的元素全部移除,并更新出栈元素对应的等待天数,这样可以确保等待天数一定是最小的。
        // 简而言之,就是维护一个单调栈,维护此前遍历过的状态,通过比较出栈得到答案
        int[] res=new int[temperatures.length];
        Deque<Integer> st = new ArrayDeque<>();
        for(int i=0;i<temperatures.length;i++)
        {
            int t= temperatures[i];
            while(!st.isEmpty() && t > temperatures[st.peek()])
            {
                // 若当前遍历元素大于栈顶元素,则意味着找到了答案,出栈继续比较
                int top=st.pop();
                res[top]=i-top;
            }
            // 直到元素小于栈顶或者没有元素,才入栈
            st.push(i);
        }
        return res;
    }
}

 

标签:容器,遍历,int,每日,元素,栈顶,739,leetcode,单调
From: https://www.cnblogs.com/lxl-233/p/18415373

相关文章

  • py每日spider案例之网站视频接口
    importrequestscookies={'auth_id':'eyJpdiI6IlUzOEVzajFocW1ydGh4TGE0R00yaXc9PSIsInZhbHVlIjoidmw2UWF0cFJBMGF0TStBM0dBWVFNN09lMFpMV2xlMHdJSG1Ma1g4TUtSV0loKzJEY1psKzVML0ZjeVJUK1BTbk1obkFpYWNMUXdLSTJXWjdOK2lZSFluL3A4WmxkVDNoUElHbGx5UG9......
  • 【计算机网络 - 基础问题】每日 3 题(六)
    ✍个人博客:Pandaconda-CSDN博客......
  • 【计算机网络 - 基础问题】每日 3 题(五)
    ✍个人博客:Pandaconda-CSDN博客......
  • LeetCode 2848. 与车相交的点(差分法、前缀和)
    题目:2848.与车相交的点思路:差分+前缀和。先找到数组中的最大值N,然后构建一个长度为N+2的数组sta。接着遍历数组,进行差分。最后求前缀和得到每个点的值,然后判断是否大于0即可。时间复杂度0(n)。classSolution{public:intnumberOfPoints(vector<vector<int>>&nu......
  • 【数据结构和算法实践-树-LeetCode113-路径总和Ⅱ】
    数据结构和算法实践-树-LeetCode113-路径总和Ⅱ题目MyThought代码示例JAVA-8题目给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点输入:root=[5,4,8,11,null,13......
  • 第307题|快速掌握 反常积分敛散性判定的方法|武忠祥老师每日一题
    解题思路:先判断这个反常积分的敛散性,再讨论a的取值范围;判断反常积分的敛散性,我们通常有三个方法:(1)根据定义,通常在原函数比较好求的情况下,可以根据定义(2)比较判别法,(3)p积分,这不是p积分。所以我们使用比较判别法来做这道题。0是无界点,又有无穷区间,既有无界函数的积分也有无......
  • sicp每日一题[2.10]
    Exercise2.11Inpassing,Benalsocrypticallycomments:“Bytestingthesignsoftheendpointsoftheintervals,itispossibletobreakmul-intervalintoninecases,onlyoneofwhichrequiresmorethantwomultiplications.”Rewritethisprocedureusin......
  • LeetCode_0044. 通配符匹配,带字母'*''?'的模式串匹配仅带字母的主串
    题目描述  给你一个输入字符串(s)和一个字符模式(p),请你实现一个支持'?'和'*'匹配规则的通配符匹配:  1.'?'可以匹配任何单个字符。  2.'*'可以匹配任意字符序列(包括空字符序列)。  3.判定匹配成功的充要条件是:字符模式必须能够完全匹配输入字符串(而不是......
  • 高级java每日一道面试题-2024年9月12日-架构篇[DDD领域驱动篇]-如何使用领域驱动设计(D
    如果有遗漏,评论区告诉我进行补充面试官:如何使用领域驱动设计(DDD)中的事务脚本模式?我回答:在Java高级面试中,讨论如何使用领域驱动设计(DDD)中的事务脚本模式是一个很好的话题,因为它不仅考察了面试者对DDD原则的理解,还检验了其在实际项目中应用这些原则的能力。事务脚本模......
  • Leetcode面试经典150题-739.每日温度
    应读者私信要求,本题协商题目的具体内容给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。示例1:输入:temperatures=[73,74,......