代码随想录Day16 单调栈

739. 每日温度

该题的题意很简单 要求遍历温度数组 找出几天后会出现下一次更高的温度 这就可以用到单调栈的知识

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了

那么我们该如何实现单调栈呢 该题目栈内保存的肯定是元素的下标 因为这样相减就可以得到几天后会出现更高的温度 0先放入栈底 然后遍历到74 通过栈顶的下标找到栈顶元素是73 因为74大于73所以ans数组下标为栈顶的下标放入1-0=1 一次类推 如果遍历的元素小于等于栈顶的元素 就要一次入栈 满足单调栈为单调递增的时候 可以求出数组右边第一个大于自己元素的位置

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st;vector<int> ans(temperatures.size(),0);st.push(0);for(int i=1;i<temperatures.size();i++){if(temperatures[i]<=temperatures[st.top()]){st.push(i);}else{while(!st.empty()&& temperatures[i]>temperatures[st.top()]){ans[st.top()]=i-st.top();st.pop();}st.push(i);}}return ans;}
};

496.下一个更大元素 I 

这一题也是单调栈的思路 不过会比较绕一点 首先给我们两个数组 我们要遍历nums1 然后让在nums2找到元素出现的位置 找到下一个更大元素的位置 返回的是元素本身

首先我们返回的数组是和nums1是一样大的 然后我们可以把nums1放到map里面映射 key为下标元素 value为下标 然后再遍历nums2数组 首先判断该元素和栈顶元素的大小 如果大于栈顶元素 再判断栈顶元素有没有在nums1里面出现过 如果出现过在ans数组value位置赋值上该元素

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {stack<int> st;vector<int> ans(nums1.size(),-1);if(nums1.size()==0) return ans;unordered_map<int,int> umap;for(int i=0;i<nums1.size();i++){umap[nums1[i]]=i;}st.push(0);for(int i=0;i<nums2.size();i++){while(!st.empty() && nums2[i]>nums2[st.top()]){if(umap.find(nums2[st.top()])!=umap.end()){int index=umap[nums2[st.top()]];ans[index]=nums2[i];}st.pop();}st.push(i);}return ans;}
};

503.下一个更大元素II 

这一题就是把数组变成了一个xun'huan'shu'z

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(), -1);if (nums.size() == 0) return result;stack<int> st;for (int i = 0; i < nums.size() * 2; i++) {// 模拟遍历两边nums,注意一下都是用i % nums.size()来操作while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) {result[st.top()] = nums[i % nums.size()];st.pop();}st.push(i % nums.size());}return result;}
};

42.接雨水

这一题就是对单调栈的应用了 题意很明确 就是利用高度差形成的凹槽我们才可以计算能接到多少的雨水 

所以在我们遍历元素的时候 我们需要知道该元素 左边第一个比他大的元素和右边第一个比他大的元素 我们知道求解右边第一个比自己的大元素的时候 我们用的是单调递增的单调栈 所以当遍历元素大于栈顶元素的时候 说明中间的凹槽就是栈顶元素 遍历元素是右边大于它的 那么左边元素肯定是之前遍历过的 根据单调栈的特性 就是栈顶元素的下一个元素 

如果当遍历元素等于栈顶元素 我们先弹出再入栈和直接入栈的结果是一样的 计算思路会有所不同 如果直接入栈 就相当于左边的元素和自己一样大 形成高度差为0 计算结果就是0 此结果和弹出栈的结果是一样的

class Solution {
public:int trap(vector<int>& height) {stack<int> st;st.push(0);int sum=0;for(int i=1;i<height.size();i++){while(!st.empty() && height[i]>height[st.top()]){int 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.柱状图中最大的矩形 

这一题思路和接雨水类似 不过该题是求 左右两边小于自己的元素 我们用单调递减栈就可以实现这个功能 左边比自己小的元素就在栈顶元素的下一位 但是与接雨水不同的是 我们这一题需要在数组的首尾加上0这个元素 因为我们必须在出现两边都有比自己小的元素的时候才会开始计算结果 避免了单调数组带来的影响

class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> st;heights.insert(heights.begin(),0);heights.push_back(0);st.push(0);int ans=0;for(int i=0;i<heights.size();i++){while(!st.empty() && heights[i]<heights[st.top()]){int mid=st.top();st.pop();int w=i-st.top()-1;int h=heights[mid];ans=max(ans,h*w);}st.push(i);}return ans;}
};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149371.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode 65. 有效数字

1.题目基本信息 1.1.题目描述 给定一个字符串 s &#xff0c;返回 s 是否是一个 有效数字。 例如&#xff0c;下面的都是有效数字&#xff1a;”2″, “0089”, “-0.1”, “3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e7”, “6e-1”, “53.5e93”, “-123.456e789…

单链表:学生信息管理系统

一、头文件 #ifndef __LINK_H__ #define __LINK_H__ #include <myhead.h> #define MAX 30 // 建立学生结构体 typedef struct student {int id; //学号char name[20]; //姓名float score; //分数 }stu;typedef struct node {union{int len;stu data;};struct node * nex…

(Arxiv-2024)DiffLoRA:通过扩散生成个性化低秩自适应权重

DiffLoRA&#xff1a;通过扩散生成个性化低秩自适应权重 paper title&#xff1a;DiffLoRA: Generating Personalized Low-Rank Adaptation Weights with Diffusion paper是电子科技大学发表在arxiv 2024的工作 paper地址 Abstract 个性化文本转图像生成因其能够根据用户定义的…

【python】requests 库 源码解读、参数解读

文章目录 一、基础知识二、Requests库详解2.1 requests 库源码简要解读2.2 参数解读2.3 处理响应2.4 错误处理 一、基础知识 以前写过2篇文章&#xff1a; 计算机网络基础&#xff1a; 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 Python实现…

环形缓冲区例子

即使使用中断函数或者定时器函数记录按键&#xff0c;如果只能记录一个键值的话&#xff0c;如果不能 及时读走出来&#xff0c;再次发生中断时新值就会覆盖旧值。要解决数据被覆盖的问题&#xff0c;可以使用 一个稍微大点的缓冲区&#xff0c;这就涉及数据的写入、读出&#…

MyBatis - 动态SQL

前言 我们在某网站填写个人信息时&#xff0c;时常会遇到可以选填的空&#xff08;即可填&#xff0c;可不填&#xff09;&#xff0c;由于之前讲过的Java中的SQL语句都是固定的&#xff0c;且我们不可能对所有情况都写出与之对应的插入语句&#xff08;太过繁琐&#xff09;&…

【LLM多模态】Animatediff文生视频大模型

note AnimateDiff框架&#xff1a;核心是一个可插拔的运动模块&#xff0c;它可以从真实世界视频中学习通用的运动先验&#xff0c;并与任何基于相同基础T2I的个性化模型集成&#xff0c;以生成动画。训练策略&#xff1a;AnimateDiff的训练包括三个阶段&#xff1a; 领域适配…

56 mysql 用户权限相关的实现

前言 这里讨论 mysql 的权限相关处理 使用如下语句创建 tz_test 用户, 并赋予他 test_02 数据库的查询权限 create user tz_test% identified by tz_test; grant select on test_02.* to tz_test%; 查询目标数据表, 数据如下, tz_test_02 UPDATE command denied to user …

前端——表单和输入

今天我们来学习web前端中的表单和输入 表单 HTML 表单用于收集用户的输入信息&#xff0c;用表单标签来完成服务器的一次交互。 HTML 表单表示文档中的一个区域&#xff0c;此区域包含交互控件&#xff0c;将用户收集到的信息发送到 Web 服务器。 HTML 表单通常包含各种输入…

Apache Dolphinscheduler:一个开源的分布式工作流调度系统

一个开源的分布式工作流调度系统 Apache Dolphinscheduler概述安装 单机部署准备工作启动DolphinScheduler登录DolphinScheduler启停服务命令配置数据库初始化数据库 DolphinScheduler集群模式准备工作修改install_env.sh文件修改dolphinscheduler_env.sh文件初始化数据库部署访…

【Python】数据可视化之分布图

分布图主要用来展示某些现象或数据在地理空间、时间或其他维度上的分布情况。它可以清晰地反映出数据的空间位置、数量、密度等特征&#xff0c;帮助人们更好地理解数据的内在规律和相互关系。 目录 单变量分布 变量关系组图 双变量关系 核密度估计 山脊分布图 单变量分布…

谷歌网站收录查询,怎么查看网站在谷歌的收录情况

在进行谷歌网站收录查询时&#xff0c;我们需采取一种既专业又系统的方法&#xff0c;以确保能够准确评估网站在谷歌搜索引擎中的可见性和收录状态。这一过程不仅关乎技术细节&#xff0c;还涉及到对搜索引擎优化&#xff08;SEO&#xff09;策略的理解与应用。以下是一个基于专…

MobaXterm基本使用 -- 服务器状态、批量操作、显示/切换中文字体、修复zsh按键失灵

监控服务器资源 参考网址&#xff1a;https://www.cnblogs.com/144823836yj/p/12126314.html 显示效果 MobaXterm提供有这项功能&#xff0c;在会话窗口底部&#xff0c;显示服务器资源使用情况 如内存、CPU、网速、磁盘使用等&#xff1a; &#xff08;完整窗口&#xff0…

QT| “无法粘贴窗口部件”错误以及customplot

“无法粘贴窗口部件”错误以及customplot “无法粘贴窗口部件”错误customplot下载添加到项目中使用QCustomPlot常用的代码 “无法粘贴窗口部件”错误 情景&#xff1a;使用QT设计界面&#xff0c;很多部分比较类似&#xff0c;可以复制另一个界面的ui&#xff0c;但是粘粘的时…

力扣 中等 1901.寻找峰值II

文章目录 题目介绍题解 题目介绍 题解 需要明白一个事实&#xff1a;从任意一个点出发&#xff0c;可以经过一个递增路径&#xff0c;找到一个极大值点。 求出一行的最大值&#xff0c;如果这行最大值比上面的要小&#xff0c;那峰值&#xff08;之一&#xff09;就会在上面 …

React-Native 中使用 react-native-image-crop-picker 在华为手机上不能正常使用拍照功能

背景: React-Native 0.66 中使用 react-native-image-crop-picker 在安卓 华为手机上不能正常使用拍照功能, 其他品牌正常 代码如下: import ImagePicker from react-native-image-crop-picker;ImagePicker.openCamera(photoOptions).then(image > {callback(image);}) …

如何释放并重新获得ip地址呢?

如何释放并重新获得ip地址呢&#xff1f; 释放并重新获得一个IP地址的具体步骤如下&#xff1a; 1、要想从DHCP服务器重新获取ip&#xff0c;电脑必须设置成"自动获取ip",设置如下&#xff0c;在电脑桌面"网络"-属性-更改适配器设置为自动获取ip。 2、然…

在CentOS 6上安装Squid代理的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 Status: 已弃用 本文涵盖的 CentOS 版本已不再受支持。如果您目前正在运行 CentOS 6 服务器&#xff0c;我们强烈建议升级或迁移到受支持…

【威领,德新,中达安】9.23复盘

威领这次的底部是4个月 所以这种跳空高开&#xff0c;远离5日均线的&#xff0c;如果不是近期的利好板块&#xff0c;那么第二天可能要回调5日均线。所以按照我的收益准则&#xff0c;吃一个板可以出一半了。 到顶部十字剩下一半也出掉了。 如果做长期&#xff0c;我依旧认为威…

CSS03-CSS的引入方式

一、CSS的三种样式表 1-1、内部样式表 示例&#xff1a; 1-2、行内样式表 1-3、外部样式表 1-4、小结