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

Leetcode 739.42. 每日温度 接雨水 单调栈 C++实现

问题:Leetcode 739. 每日温度

算法1:从右到左

        栈中记录下一个更大元素的「候选项」。

代码:

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        vector<int> ans(n); // 初始化返回数组为0
        stack<int> st; // 栈
        for(int i = n - 1;i >= 0;i--) {
            int t = temperatures[i];
            while(!st.empty() && t >= temperatures[st.top()])   st.pop(); // 说明栈顶元素不符合条件,出栈
            if(!st.empty()) ans[i] = st.top() - i;
            st.push(i); // 当前温度进栈
        }
        return ans;
    }
};

算法2:从左到右

        栈中记录还没算出「下一个更大元素」的那些数(的下标)。

代码:

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        vector<int> ans(n); // 初始化返回数组为0
        stack<int> st; // 栈
        for(int i = 0;i < n;i++){
            int t = temperatures[i];
            while(!st.empty() && t > temperatures[st.top()]){
                ans[st.top()] = i - st.top();
                st.pop();
            }
            st.push(i);
        }
        return ans;
    }
};

问题:Leetcode 42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

8acf009f9d044af2bebe3e7b103af05e.png

算法:前两种算法请看文章Leetcode 11.42. 接雨水

        在这里运用单调栈的方法解决。从左向右遍历,一步步填坑,如果右边界大于等于栈中的值,则可以填,填完后先将填完的位置出栈,然后把当前遍历到的位置入栈。

代码:

class Solution {
public:
    int trap(vector<int>& height) {
        int ans = 0;
        stack<int> st;
        for(int i = 0;i < height.size();i++){
            while(!st.empty() && height[i] >= height[st.top()]){
                int bottom_h = height[st.top()]; // 要填的位置的高
                st.pop();
                if(st.empty())    break; // 如果左边界不存在,break
                int left = st.top(); // 要填的位置的左边界序号
                int dh = min(height[left],height[i]) - bottom_h; // 要填的高
                ans += dh * (i - left - 1);
            }
            st.push(i);
        }
        return ans;
    }
};


http://www.kler.cn/news/326270.html

相关文章:

  • 局部整体(七)利用python绘制圆形嵌套图
  • 2024/9/29周报
  • SpringMVC5-域对象共享数据
  • NIO基础
  • Java集合ArrayList的扩容原理是什么?附源码讲解+举例说明
  • DSPy101
  • 有源滤波器故障怎么处理
  • Redis哨兵模式的搭建以及配置参数简介
  • websocket接收文心一言示例
  • 【系统架构设计师】经典论文:轮软件三层架构设计
  • ClickHouse | 入门
  • Python鸭子类型解释
  • ubuntu 下载安装 启动盘创建器,将ubuntu22.04的Ios文件,制作成启动盘
  • C++(string字符串、函数)
  • Python知识点:如何使用Airflow进行ETL任务调度
  • 2024 Python3.10 系统入门+进阶(十六):正则表达式
  • 如何提升网页加载和跳转速度:Flask 模板渲染 vs Nginx 静态资源处理
  • 数商云B2B2C商城系统如何帮企业降本增效
  • 【Linux】模拟实现一个shell
  • 六、设计模式-6.2、代理模式
  • 鸿蒙 如何退出 APP
  • JSON字符串转换成对象
  • 嵌套的JSON字符串解析成Java对象
  • 瑜伽馆预约小程序,在线瑜伽课程预约系统
  • 希捷电脑硬盘好恢复数据吗?探讨可能性、方法以及注意事项
  • 1. 如何在服务器上租GPU跑实验 (以AutoDL为例) - 深度学习·科研实践·从0到1
  • C++ 机器人相关面试点
  • 清华大学开源视频转文本模型——CogVLM2-Llama3-Caption
  • 因果推断学习
  • Flink集群部署