【Leetcode 热题 100】739. 每日温度

问题背景

给定一个整数数组 t e m p e r a t u r e s temperatures temperatures,表示每天的温度,返回一个数组 a n s w e r answer answer,其中 a n s w e r i answeri answeri 是指对于第 i i i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 0 0 来代替。

数据约束

  • 1 ≤ t e m p e r a t u r e s . l e n g t h ≤ 1 0 5 1 \le temperatures.length \le 10 ^ 5 1≤temperatures.length≤105
  • 30 ≤ t e m p e r a t u r e s i ≤ 100 30 \le temperaturesi \le 100 30≤temperaturesi≤100

解题过程

单调栈模板题,可以大概地抽象为,为数组中每个位置上的元素找到之后第一个大于它的值,直接记住要比用的时候再推导更高效。

有两种思路,从右往左遍历,栈中记录的是所有的候选项,如果出现新加入的元素不小于栈顶的元素,那么栈中的元素应当按序出栈;从左往右遍历,栈中记录的是所有尚未确定结果的位置,如果刚刚访问到的元素满足题目条件,那么记录结果,将栈顶元素出栈,将新的元素入栈。

具体实现

从右往左

java 复制代码
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] res = new int[n];
        // 队列和栈都是用双端队列来模拟
        Deque<Integer> stack = new ArrayDeque<>();
        for(int i = n - 1; i >= 0; i--) {
            int cur = temperatures[i];
            // 如果栈非空且当前元素大于栈顶元素,那么栈顶元素依次出栈
            while(!stack.isEmpty() && cur >= temperatures[stack.peek()]) {
                stack.pop();
            }
            if(!stack.isEmpty()) {
                res[i] = stack.peek() - i;
            }
            // 栈中记录的是元素的下标
            stack.push(i);
        }
        return res;
    }
}

从左往右

java 复制代码
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] res = new int[n];
        // 队列和栈都是用双端队列来模拟
        Deque<Integer> stack = new ArrayDeque<>();
        for(int i = 0; i < n; i++) {
            int cur = temperatures[i];
            // 如果栈非空且当前元素符合大于栈顶元素这个条件,那么记录结果
            while(!stack.isEmpty() && cur > temperatures[stack.peek()]) {
                int top = stack.pop();
                res[top] = i - top;
            }
            // 栈中记录的是下标
            stack.push(i);
        }
        return res;
    }
}
相关推荐
0566463 小时前
Python康复训练——数据结构
数据结构·windows·python
冻柠檬飞冰走茶3 小时前
PTA基础编程题目集 7-27 冒泡法排序(C语言实现)
c语言·开发语言·数据结构·算法
大鱼>4 小时前
因子挖掘+回测+RL交易:量化金融完整系统
人工智能·深度学习·算法·金融
c238566 小时前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法
吃好睡好便好6 小时前
MATLAB中图像的对数变换
图像处理·学习·算法·计算机视觉·matlab
noipp6 小时前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
极客BIM工作室6 小时前
OpenCascade 倒角(Chamfer)算法完整逻辑解析
算法
冻柠檬飞冰走茶6 小时前
PTA基础编程题目集 7-20 打印九九口诀表(C语言实现)
c语言·开发语言·数据结构·算法
鱼子星_6 小时前
《算 · 法》题目解析篇(1):最近公共祖先问题,线段树,最长回文子序列
c++·算法·动态规划·递归
雾喔6 小时前
算法练习5
算法·代理模式