文章目录
- [一. 力扣 [739. 每日温度](https://leetcode.cn/problems/daily-temperatures/description/)](#一. 力扣 739. 每日温度)
-
- [1. 题目解析](#1. 题目解析)
- [2. 算法原理](#2. 算法原理)
- [3. 代码](#3. 代码)
- [二. 力扣 [84. 柱状图中最大的矩形](https://leetcode.cn/problems/largest-rectangle-in-histogram/description/)](#二. 力扣 84. 柱状图中最大的矩形)
-
- [1. 题目解析](#1. 题目解析)
- [2. 算法原理](#2. 算法原理)
- [3. 代码](#3. 代码)
对于单调栈的学习看的是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;
}
}




