739. 每日温度(leetcode)

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

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;
    }
}

 

posted @   风乐  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2022-09-14 集群启停以及WebUI
点击右上角即可分享
微信分享提示