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

文章目录

对于单调栈的学习看的是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;
    }
}
相关推荐
古法老登瞎折腾5 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
飞Link5 小时前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
智能运维指南6 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
yz_aiks6 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵6 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设7 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都7 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
鱼宵7 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作
一去不复返的通信er7 小时前
贪心算法-合并区间(LeetCode 56)
算法·leetcode·贪心算法
白山编程大哥7 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list