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

文章目录

对于单调栈的学习看的是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;
    }
}
相关推荐
cpp_250122 分钟前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
thefool11226633 分钟前
Java 数组是引用类型
java
阳明山水1 小时前
TimesFM与Moirai MoE零样本预测解析
人工智能·深度学习·算法·机器学习·架构
铅笔侠_小龙虾1 小时前
Rust 学习(2)-变量、常量与 shadowing
学习·算法·rust
cfm_29142 小时前
Spring监听器
java·spring boot·后端
AI科技星2 小时前
基于全域数学公理体系的三元极值题最简求解法【乖乖数学】
线性代数·算法·游戏·决策树·机器学习·乖乖数学·全域数学
SamDeepThinking2 小时前
Java面向对象在JVM里怎么实现
java·后端·面试
大鱼>2 小时前
宠物异常行为预警系统:边缘计算与实时检测
人工智能·深度学习·算法·iot·宠物
咸鱼翻身小阿橙3 小时前
多线程解析
java·开发语言
apcipot_rain3 小时前
某双非机试真题
算法