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

文章目录

对于单调栈的学习看的是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;
    }
}
相关推荐
码智社10 分钟前
JSON 零基础到资深全体系教程
java·json
AndrewHZ13 分钟前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场1 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
wgego1 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
冻柠檬飞冰走茶1 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
机建狂魔2 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex
玖玥拾2 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
数据皮皮侠AI2 小时前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法
山峰哥2 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
乐观的Terry2 小时前
11、发布系统-用户认证与权限体系
java·spring boot·spring·spring cloud·mybatis