算法奇妙屋(四十八)-单调栈

文章目录

对于单调栈的学习看的是b站的 柱状图中最大的矩形LeetCode84单调栈的应用|739. 每日温度|单调栈|力扣hot100

一. 力扣 739. 每日温度

1. 题目解析

画出图后更清晰易懂

2. 算法原理

单调栈解法

3. 代码

java 复制代码
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        Stack<Integer> stack = new Stack<>();
        stack.push(0);
        int[] ret = new int[n];
        for (int i = 1; i < n; i++) {
            while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
                int tmp = stack.pop();
                ret[tmp] = i - tmp;
            }
            // 循环到这里说明队列为空或者temperatures[i] <= 栈顶元素
            stack.push(i);
        }
        // 这里因为ret的初始化值都为0, 不用再继续判断栈中是否为空
        return ret;
    }
}

二. 力扣 84. 柱状图中最大的矩形

1. 题目解析

题意还是很好理解的, 就是求相邻柱状图组成矩形的最大面积

2. 算法原理

暴力解法

单调栈解法, 是在暴力枚举的基础上的一种优化

3. 代码

java 复制代码
class Solution {
    public int largestRectangleArea(int[] heights) {
        int n = heights.length;
        Stack<Integer> stack = new Stack<>();
        stack.push(0);
        int[] h = new int[n + 2];
        for (int i = 1; i <= n; i++) {
            h[i] = heights[i - 1];
        }
        int ret = 0;
        for (int i = 1; i <= n + 1;) {
            // 所有大于栈顶的元素, 下标都加入栈
            while (i <= n + 1 && h[i] >= h[stack.peek()]) {
                stack.push(i++);
            }
            // 到这里说明i位置元素肯定<栈顶元素, 不用担心栈中可能为空, 因为h[i]>=0,一定有元素
            while (i <= n + 1 && h[i] < h[stack.peek()]) {
                int r = i;
                int num = h[stack.pop()];
                int l = stack.peek();
                int s = (r - l - 1) * num;
                ret = Math.max(ret, s);
            }
        }
        return ret;
    }
}
相关推荐
金幄科技2 分钟前
RAG第四篇:重排序 Rerank——粗召回之后,为什么还需要一次精排
人工智能·算法·ai·ai编程
M78佐菲7 分钟前
Linux学习笔记:文件IO
linux·笔记·学习·算法
谢亮_vipxieliang11 分钟前
手机号验证技术方案:号段规则与正则表达式
java·服务器·spring boot·正则表达式·hibernate
wang090723 分钟前
自己动手写一个tomcat之7监听器和过滤器
java·tomcat
梅孔立23 分钟前
Pi-Agent 终极极简配置文档(Java+Vue+Python爬虫 4-5千文件项目)
java·vue.js·python
Query*36 分钟前
Agent 开发之项目 AI Native 化:通过大模型与 RAG 赋予产品智能能力
java·人工智能·ai
孫治AllenSun37 分钟前
【LangChain4J-03】Springboot 项目搭建框架
java·spring boot·后端
君顾137 分钟前
AI新零售线上商城系统实战:架构设计与开发全流程指南
java·开发语言·零售
qq_485015211 小时前
MyBatis-Plus 3.x FieldStrategy 作用
java·数据库·mybatis
lhldsg1 小时前
课程排课系统实战指南:从数据库设计到算法调优全流程解析
java·数据库·算法·小程序