当前位置: 首页 > article >正文

【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 ] answer[i] answer[i] 是指对于第 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 1temperatures.length105
  • 30 ≤ t e m p e r a t u r e s [ i ] ≤ 100 30 \le temperatures[i] \le 100 30temperatures[i]100

解题过程

单调栈模板题,可以大概地抽象为,为数组中每个位置上的元素找到之后第一个大于它的值,直接记住要比用的时候再推导更高效。
有两种思路,从右往左遍历,栈中记录的是所有的候选项,如果出现新加入的元素不小于栈顶的元素,那么栈中的元素应当按序出栈;从左往右遍历,栈中记录的是所有尚未确定结果的位置,如果刚刚访问到的元素满足题目条件,那么记录结果,将栈顶元素出栈,将新的元素入栈。

具体实现

从右往左

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

从左往右

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

http://www.kler.cn/a/504795.html

相关文章:

  • Windows 环境下安装和启动 Redis 服务
  • Java 面试题 - ArrayList 和 LinkedList 的区别,哪个集合是线程安全的?
  • IDEA的Java注释在Toggle Rendered View下的字号调整方式
  • 《零基础Go语言算法实战》【题目 2-30】并发安全问题
  • Linux 机器学习
  • 【Unity-Animator】通过 StateMachineBehaviour 实现回调
  • 学习华为熵减:激发组织活力(系列之三)
  • Mac 删除ABC 输入法
  • candb++ windows11运行报错,找不到mfc140.dll
  • vscode离线安装插件--终极解决方案
  • 批量为视频生成字幕
  • 测试模型安全的手段
  • 突破跨境电商瓶颈:亚矩阵云手机应用全解析
  • RabbitMQ---消息确认和持久化
  • lanqiaoOJ 3333:肖恩的排序 ← 双指针+排序(从大到小)
  • mock服务-通过json定义接口自动实现mock服务
  • Python在WRF模型自动化运行及前后处理中实践技术应用-包括数据处理、模型运行、结果可视化等步骤。
  • 72_List列表原理
  • 计算机组成原理简答题、名词解释整理(考研、期末)
  • Android Perfetto 系列
  • Python 在企业级应用中的两大硬伤
  • 极客说|Azure AI Agent Service 结合 AutoGen/Semantic Kernel 构建多智能体解决⽅案
  • 如何发布自己的第一个Chrome扩展程序
  • 基于微信小程序的社区门诊管理系统php+论文源码调试讲解
  • C++ 类模板教程
  • 分布式ID的实现方案