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

文章目录

对于单调栈的学习看的是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;
    }
}
相关推荐
3D探路人33 分钟前
模灵 大模型聚合API 转发流程技术实现
java·大数据·开发语言·前端·人工智能·计算机视觉
sheeta19981 小时前
LeetCode 每日一题笔记 日期:2026.05.13 题目:1674. 使数组互补的最少操作次数
笔记·算法·leetcode
liulilittle1 小时前
TCP UCP v1.0:BBR 的非破坏性约束层
网络·c++·网络协议·tcp/ip·算法·c·通信
每天回答3个问题1 小时前
LeetCodeHot100|回溯算法、46.全排列、78.子集、17.电话号码的字母组合
算法·深度优先·回溯
程似锦吖1 小时前
无中生有 之 从0开始写一个动态定时任务管理
java·开发语言
techdashen1 小时前
dial9:给 Tokio 装上“飞行记录仪“
java·数据库·redis
ShiJiuD6668889992 小时前
springboot基础篇
java·spring boot·spring
砚底藏山河2 小时前
python、JavaScript 、JAVA,定制化数据服务,助力业务高效落地
java·javascript·python
qq_452396232 小时前
第六篇:《JMeter逻辑控制器:循环、条件和交替执行》
android·java·jmeter
humcomm2 小时前
Java 新特性2026年5月速览
java·开发语言