【算法】单调栈 每日温度 接雨水

news2024/11/27 9:44:29

文章目录

  • 例题
    • 739. 每日温度
    • 42. 接雨水
  • 相关练习
    • 1475. 商品折扣后的最终价格
    • 901. 股票价格跨度
    • 1019. 链表中的下一个更大节点
    • 84. 柱状图中最大的矩形

单调栈【基础算法精讲 26】

例题

739. 每日温度

https://leetcode.cn/problems/daily-temperatures/description/
在这里插入图片描述

提示:

1 <= temperatures.length <= 10^5
30 <= temperatures[i] <= 100

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] ans = new int[n];
        Deque<Integer> stk = new ArrayDeque<>();
        for (int i = 0; i < n; ++i) {
            while (!stk.isEmpty() && temperatures[i] > temperatures[stk.peek()]) {
                int l = stk.pop();
                ans[l] = i - l;
            }
            stk.push(i);
        }
        return ans;
    }
}

42. 接雨水

https://leetcode.cn/problems/trapping-rain-water/
在这里插入图片描述

提示:

n == height.length
1 <= n <= 2 * 10^4
0 <= height[i] <= 10^5

每次计算的是一层。(还挺难理解的)

class Solution {
    public int trap(int[] height) {
        Deque<Integer> stk = new ArrayDeque<>();
        int ans = 0;
        for (int i = 0; i < height.length; ++i) {
            while (!stk.isEmpty() && height[i] > height[stk.peek()]) {
                int cur = stk.pop();
                if (!stk.isEmpty()) {
                    int l = stk.peek();
                    ans += (Math.min(height[i], height[l]) - height[cur]) * (i - l - 1);
                }
            }
            stk.push(i);
        }
        return ans;
    }
}

相关练习

1475. 商品折扣后的最终价格

https://leetcode.cn/problems/final-prices-with-a-special-discount-in-a-shop/description/

在这里插入图片描述
提示:
1 <= prices.length <= 500
1 <= prices[i] <= 10^3

class Solution {
    public int[] finalPrices(int[] prices) {
        int n = prices.length;
        int[] ans = new int[n];
        Arrays.setAll(ans, e -> prices[e]);
        Deque<Integer> stk = new ArrayDeque<>();
        for (int i = 0; i < n; ++i) {
            while (!stk.isEmpty() && prices[i] <= prices[stk.peek()]) {
                int l = stk.pop();
                ans[l] -= prices[i];
            }
            stk.push(i);
        }
        return ans;
    }
}

901. 股票价格跨度

https://leetcode.cn/problems/online-stock-span/
在这里插入图片描述

提示:

1 <= price <= 10^5
最多调用 next 方法 10^4 次

就是找每个位置的上一个更大的位置。

class StockSpanner {
    Deque<int[]> stk = new ArrayDeque();
    int i;

    public StockSpanner() {
        stk.push(new int[]{-1, 0x3f3f3f3f});
        i = -1;
    }
    
    public int next(int price) {
        while (price >= stk.peek()[1]) stk.pop();
        int res = ++i - stk.peek()[0];
        stk.push(new int[]{i, price});
        return res;
    }
}

/**
 * Your StockSpanner object will be instantiated and called as such:
 * StockSpanner obj = new StockSpanner();
 * int param_1 = obj.next(price);
 */

1019. 链表中的下一个更大节点

https://leetcode.cn/problems/next-greater-node-in-linked-list/description/
在这里插入图片描述

提示:
链表中节点数为 n
1 <= n <= 104
1 <= Node.val <= 10^9

先将链表转换成列表,再使用单调栈处理。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public int[] nextLargerNodes(ListNode head) {
        List<Integer> nums = new ArrayList<>();
        while (head != null) {
            nums.add(head.val);
            head = head.next;
        }
        int n = nums.size();
        int[] ans = new int[n];
        Deque<Integer> stk = new ArrayDeque<>();
        for (int i = 0; i < n; i++) {
            while (!stk.isEmpty() && nums.get(i) > nums.get(stk.peek())) {
                ans[stk.pop()] = nums.get(i);
            }
            stk.push(i);
        }
        return ans;
    }
}

84. 柱状图中最大的矩形

https://leetcode.cn/problems/largest-rectangle-in-histogram/description/

在这里插入图片描述

提示:

1 <= heights.length <=10^5
0 <= heights[i] <= 10^4

用单调栈计算出 l[] 和 r[],这两个数组分别表示 i 左右两边第一个比 height[i] 更小的数。

class Solution {
    public int largestRectangleArea(int[] heights) {
        int n = heights.length, ans = 0;
        int[] l = new int[n], r = new int[n];
        Arrays.fill(l, -1);
        Arrays.fill(r, n);
        Deque<Integer> stk = new ArrayDeque<>();
        for (int i = 0; i < n; ++i) {
            while (!stk.isEmpty() && heights[i] < heights[stk.peek()]) {
                r[stk.pop()] = i;
            }
            if (!stk.isEmpty()) l[i] = stk.peek();
            stk.push(i);
        }
        for (int i = 0; i < n; ++i) {
            ans = Math.max(ans, heights[i] * (r[i] - l[i] - 1));
        }
        return ans;
    }
}

注意这里对数组 l[] 和 r[] 做了初始化,所以能避免下面描述的错误。(即最后结果是正确的)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1175467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

麒麟V4搭建本地源

1.创建本地源目录 mkdir -p /package/pack 2.修改目录权限为_apt属组 chown _apt /package/pack 3.将软件包复制到/package/pack cp -av 软件包 /package/pack 4.修改目录权限为755 chmod -R 755 /package/ 5.创建本地源的index文件 dpkg-scanpackages . | gzip -9c &…

算法通关村第六村-白银挑战树的层序遍历

大家好我是苏麟 , 今天说说数的层序遍历 . 层次遍历简介 广度优先在面试里出现的频率非常高&#xff0c;整体属于简单题&#xff0c;但是很多人面试遇到时就直接放弃了&#xff0c;实在可惜。我们本章就集中研究一下到底难在哪里。 广度优先又叫层次遍历&#xff0c;基本过程…

Oracle-Ogg经典模式升级为集成模式步骤

​前言: Oracle Ogg集成模式比起经典模式功能更加的强大&#xff0c;支持更多的数据类型&#xff0c;压缩表同步&#xff0c;XA事务&#xff0c;多线程模式&#xff0c;PDB模式同步&#xff0c;RAC环境下抽取配置简单等新功能&#xff0c;所以可以选择将经典模式升级转化为集成…

The service already exists! 安装mysql数据库错误!

当你输入mysql install命令时报The service already exists! 报错的原因是服务已经存在&#xff01; 说明你之前可能已经装过了。 解决方法&#xff1a; 输入sc delete mysql 提示DeleteService 成功,则表示删除成功&#xff0c;你就可以重新输入mysqld install了。 最后显…

IntelliJ IDEA 2022创建Maven项目

IntelliJ IDEA 2022创建Maven项目 点击New Project 配置一下下 (1). 选择Maven Archetype (2). 输入Name就是你的项目名称 (3). 输入Location是你的项目保存目录 (4). 选择JDK (5). 选择Catalog一般默认选择Internal即可 在Archetype这里我们选择一个模板来创建Maven项目 …

Mybatis学习(黑马程序员)

Mybatis操作数据库的步骤&#xff1a; 准备工作(创建springboot工程、数据库表user、实体类User)引入Mybatis的相关依赖&#xff0c;配置Mybatis(数据库连接信息)编写SQL语句(注解/XML 1.创建springboot工程&#xff0c;并导入 mybatis的起步依赖、mysql的驱动包 2.在springb…

C++ 信息学奥赛 2046:【例5.15】替换字母

#include<cstdio> #include<iostream> using namespace std; int main() { char st[200];char A,B; int n0;while((st[n]getchar())!\n); //将原文存放在字符数组st中,并且要注意上述的最后分号 Agetchar();getchar();Bgetchar(); //读取A和B&#xff0c;中间get…

10 行代码即可检测脸部情绪

引言 面部表情展示人类内心的情感。它们帮助我们识别一个人是愤怒、悲伤、快乐还是正常。医学研究人员也使用面部情绪来检测和了解一个人的心理健康。 人工智能在识别一个人的情绪方面可以发挥很大的作用。在卷积神经网络的帮助下&#xff0c;我们可以根据一个人的图像或实时视…

mipi DPHY学习记录

DPHY的内容很多,而且细节很多,我会一点一点的进行补充记录,今天要记录的是cdphy的LP-MODE数据传输的过程。 1:HS 和LP mode lane status 和 lane上的电压 HS mode时,差分线上的电压摆幅为200mv,LP mode时,差分线上的电压为1.2v 2:HS mode data Transmission start 在…

SHAP(一):使用 XGBoost 预测英雄联盟获胜

SHAP&#xff08;一&#xff09;&#xff1a;使用 XGBoost 预测英雄联盟获胜 本笔记本使用 Kaggle 数据集 英雄联盟排名比赛&#xff0c;其中包含从 2014 年开始的 180,000 场英雄联盟排名比赛。 根据这些数据&#xff0c;我们构建了一个 XGBoost 模型&#xff0c;根据有关该球…

48基于matlab的经验傅里叶分解,适用于非线性及非平稳时间序列分析,将信号进行精确分解。程序已调通,可直接运行。

基于matlab的经验傅里叶分解&#xff0c;适用于非线性及非平稳时间序列分析&#xff0c;将信号进行精确分解。程序已调通&#xff0c;可直接运行。

3D高斯泼溅(Splatting)简明教程

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 3D 高斯泼溅&#xff08;Splatting&#xff09;是用于实时辐射场渲染的 3D 高斯分布描述的一种光栅化技术&#xff0c;它允许实时渲染从小图像样…

优先级队列:PriorityQueue常用接口+构造+方法+源码分析+OJ练习

文章目录 PriorityQueue常用接口一.PriorityQueue 的特性二.PriorityQueue常用接口介绍1.优先级队列的构造2.插入/删除/获取优先级最高的元素3.PriorityQueue的扩容方式&#xff1a; PriorityQueue常用接口 一.PriorityQueue 的特性 1.Java集合框架中提供了 **PriorityQueue *…

ActiveMq学习⑦__ActiveMq协议

问题一、默认的61616端口如何更改&#xff1f; 问题二、你生产上的链接协议如何配置的&#xff1f;使用tcp吗&#xff1f; ActiveMQ 支持的client-broker 通讯协议有&#xff1a;TVP、NIO、UDP、SSL、Http(s)、VM。 其中配置TransportConnector 的文件在ActiveMQ 安装目录的co…

产品经理墨刀学习----注册页面

我们做的产品是一个校园论坛学习开发系统&#xff0c;目前才开始学习。 &#xff08;一&#xff09;流程图 &#xff08;二&#xff09;简单墨刀设计--注册页面 &#xff08;1&#xff09;有账号 &#xff08;a&#xff09;直接登录&#xff1a; &#xff08;b&#xff09;忘…

Git使用规范指南

文章目录 Git使用规范指南前言分支命名规范分支合并流程规范提交信息规范Angular提交规范注意事项 通用Git忽略文件配置 Git使用规范指南 前言 由于最近写完代码之后&#xff0c;Git使用不规范被领导说了&#xff0c;所以最近通过阅读大量的相关博客快速学习Git使用规范&#…

apachesolr启动带调试

这里solr.cmd报错&#xff0c;报错原因是java版本问题&#xff0c;后面发现这是因为多个java版本导致读取java_home失败&#xff0c; 那么我们修改solr.cmd中的JAVA_HOME为SOLR_JAVA_HOME IF DEFINED SOLR_JAVA_HOME set "JAVA_HOME%SOLR_JAVA_HOME%"环境变量将SOLR…

Qt全局定义

一、QtGlobal头文件 头文件中包含了Qt类库的一些全局定义&#xff0c;包括&#xff1a; 基本数据类型全局函数宏定义 二、基本数据类型 三、全局函数 四、宏定义 1.Qt版本相关的宏 1.1 QT_VERSION 这个宏展开为数值形式 0xMMNNPP (MM major, NN minor, PP patch) 表示…

P9831 [ICPC2020 Shanghai R] Gitignore

P9831 [ICPC2020 Shanghai R] Gitignore - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 只看题意翻译这道题是做不出来的&#xff0c;还要去看英文里面的规定&#xff08;这里就不放英文了&#xff09;&#xff0c;主要问题是不要公用子文件夹。 例如: 1 / a / 2 2 / a / 3…

【C语言】函数的系统化精讲(一)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 &#x1f308;作者寄语 &#x1f308;&#xff1a; 小菜鸟的力量不在于它的体型&#xff0c;而在于它内心的勇气和无限的潜能&#xff0c;只要你有决心&#xff0c;就没有什么事情是不可能的…