当前位置: 首页 > news >正文

力扣42题 接雨水,力扣84题 柱状图中最大的矩形,力扣739题 每日温度

这三道题都是单调栈的应用

力扣739题    每日温度

使用单调栈主要有三个判断条件

1.当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况

2.当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况

3.当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况

要保持单调递增的栈,如果栈头元素大于栈底元素,将栈顶元素弹出,此时result数组就可以进行记录了。

class Solution {
public:vector<int> dailyTemperatures(vector<int>& T) {// 递增栈stack<int> st;vector<int> result(T.size(), 0);st.push(0);for (int i = 1; i < T.size(); i++) {if (T[i] < T[st.top()]) {                       // 情况一st.push(i);} else if (T[i] == T[st.top()]) {               // 情况二st.push(i);} else {while (!st.empty() && T[i] > T[st.top()]) { // 情况三result[st.top()] = i - st.top();st.pop();}st.push(i);}}return result;}
};

力扣42题   接雨水

类型:单调栈

三种情况:

情况一:当前遍历的元素(柱子)高度小于栈顶元素的高度height[i]<height[st.top()]

情况二:当前遍历的元素(柱子)高度等于栈顶元素的高度height[i]==height[st.top()]

情况三:当前遍历的元素(柱子)高度大于栈顶元素的高度height[i]>height[st.top()]

先将下标0的柱子加入到栈中,st.push(0),栈中存放我们遍历过的元素,因此先将下标0加进来。

然后从下标1开始遍历所有的柱子,for(int i=1;i<height.size();i++)

如果当前遍历的元素(柱子)高度小于栈顶元素的高度,就把这个元素加入栈中,因为栈中本来就要保持从小到大的顺序(从栈头到栈底)

需要维护单调递减的栈

class Solution {
public:int trap(vector<int>& height) {if (height.size() <= 2) return 0; // 可以不加stack<int> st; // 存着下标,计算的时候用下标对应的柱子高度st.push(0);int sum = 0;for (int i = 1; i < height.size(); i++) {if (height[i] < height[st.top()]) {     // 情况一st.push(i);} if (height[i] == height[st.top()]) {  // 情况二st.pop(); // 其实这一句可以不加,效果是一样的,但处理相同的情况的思路却变了。st.push(i);} else {                                // 情况三while (!st.empty() && height[i] > height[st.top()]) { // 注意这里是whileint mid = st.top();st.pop();if (!st.empty()) {int h = min(height[st.top()], height[i]) - height[mid];int w = i - st.top() - 1; // 注意减一,只求中间宽度sum += h * w;}}st.push(i);}}return sum;}
};


力扣84题 柱状图中最大的矩形

1.情况一:当前遍历的元素heights[i]大于栈顶元素heights[st.top()]的情况

2.情况二:当前遍历的元素heights[i]等于栈顶元素heights[st.top()]的情况

3.情况三:当前遍历的元素heights[i]小于栈顶元素heights[st.top()]的情况

思路和接雨水差不多,除了栈内元素顺序和接雨水不同而已。


class Solution {
public:int largestRectangleArea(vector<int>& heights) {int result = 0;stack<int> st;heights.insert(heights.begin(), 0); // 数组头部加入元素0heights.push_back(0); // 数组尾部加入元素0st.push(0);// 第一个元素已经入栈,从下标1开始for (int i = 1; i < heights.size(); i++) {if (heights[i] > heights[st.top()]) { // 情况一st.push(i);} else if (heights[i] == heights[st.top()]) { // 情况二st.pop(); // 这个可以加,可以不加,效果一样,思路不同st.push(i);} else { // 情况三while (!st.empty() && heights[i] < heights[st.top()]) { // 注意是whileint mid = st.top();st.pop();if (!st.empty()) {int left = st.top();int right = i;int w = right - left - 1;int h = heights[mid];result = max(result, w * h);}}st.push(i);}}return result;}
};

 

http://www.wxhsa.cn/company.asp?id=5681

相关文章:

  • 使用HTTPS 服务在浏览器端启用摄像头的方式解析
  • 5分钟SAE极速部署Dify,高效开发AI智能体应用
  • .NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
  • 事件轮循机制EventLoop
  • ruoyi-vue初步接触
  • AT_arc180_c [ARC180C] Subsequence and Prefix Sum
  • 如何快速看懂「祖传项目」?Qoder 强势推出新利器
  • 测试不再碎片化:AI智能体平台「项目资料套件」功能上线!
  • 大模型与知识图谱驱动测试公开课
  • 上位机项目展示
  • 美化自己的Github主页-Github profile页面仓库使用指南
  • 充气泵方案:充气泵用数字传感器有什么好处?
  • windows系统下anaconda的安装和使用
  • Lock分析:systemstate分析row cache lock
  • mysql查看连接数,从查询到优化
  • 遗传算法与偏最小二乘结合的化学光谱变量选择方法
  • 云剪贴板
  • 读书笔记:Oracle数据库的水位线秘密:为什么空表查询还很慢?
  • AI测试平台自动遍历:低代码也能玩转全链路测试
  • 0代码5分钟一键生成Springboot+Vue后台管理系统
  • nvm与node.js的安装指南
  • 故障处理:2分钟处理Oracle RAC中OCR磁盘组丢失磁盘的故障
  • Saga分布式事务框架执行逻辑
  • 在Android开发中实现两个Intent跳转及数据交换的方法
  • ARC188 做题记
  • AT_arc145_d [ARC145D] Non Arithmetic Progression Set
  • Microsoft AI Genius | 第三集实战课正式开启:用 Copilot Studio 定制你的专属智能体
  • C# 多线程编程核心要点:不只是Thread和lock
  • 基于MATLAB的图像融合拼接GUI系统设计
  • Python使用多线程和异步调用