单调栈的作用

就是用一个栈来记录我们遍历过的元素

单调栈里存放元素下标i就可以了,如果要使用对应元素,直接T[i]就可以获取到

从栈头到栈尾-递增的话-栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i

题目

LeetCode:739.每日温度

解法

将下标存放进单调栈中

当前遍历的元素和栈顶元素进行比较T[i]和T[st.pop()]

T[i]==T[st.pop()] 入栈

T[i]>T[st.pop()] 记录结果

T[i]<T[st.pop()] 入栈

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st;vector<int> reulst(temperatures.size(),0);st.push(0);//放入第一个元素for(int i=1;i<temperatures.size();i++){if(temperatures[i]<temperatures[st.top()]) st.push(i);else if(temperatures[i]==temperatures[st.top()]) st.push(i);else{while(!st.empty()&&temperatures[i]>temperatures[st.top()]){reulst[st.top()]=i-st.top();st.pop();}st.push(i);}}return reulst;}
};

LeetCode:496.下一个更大

解法

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> result(nums1.size(),-1); //结果数组的长度与1相等stack<int> st;if(nums1.size()==0) return result;unordered_map<int,int> umap;//对数组1进行处理 建立哈希表for(int i=0;i<nums1.size();i++){umap[nums1[i]]=i;}//用单调栈遍历数组2st.push(0);for(int i=1;i<nums2.size();i++){if(nums2[i]<nums2[st.top()])//小于 等于 都直接入栈st.push(i);else if(nums2[i]==nums2[st.top()]) st.push(i);else{//大于栈顶元素 处理结果while(!st.empty()&&nums2[i]>nums2[st.top()]){//判断元素是否出现过if(umap.count(nums2[st.top()])>0){int index=umap[nums2[st.top()]];result[index]=nums2[i];}st.pop();}st.push(i);}}return result;}
};

LeetCode:503.下一个更大元素II

用取模的过程模拟成环的遍历

for(i=0;i<nums.size()*2;i++){

i%nums.size()

}

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(),-1);stack<int> st;st.push(0);//放入第一个元素for(int i=1;i<nums.size()*2;i++){if(nums[i%nums.size()]<=nums[st.top()]) st.push(i%nums.size());else{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;}
};

LeetCode:42.接雨水

class Solution {
public:int trap(vector<int>& height) {stack<int> st;st.push(0);int sum=0;//从1开始遍历所有柱子for(int i=1;i<height.size();i++){//如果当前遍历的元素(柱子)高度小于栈顶元素的高度,就把这个元素加入栈中,因为栈里本来就要保持从小到大的顺序(从栈头到栈底)if(height[i]<height[st.top()]){st.push(i);}//如果当前遍历的元素(柱子)高度等于栈顶元素的高度,要跟更新栈顶元素,因为遇到相相同高度的柱子,需要使用最右边的柱子来计算宽度。else if(height[i]==height[st.top()]){st.pop();st.push(i);}//如果当前遍历的元素(柱子)高度大于栈顶元素的高度,此时就出现凹槽了else{while(!st.empty()&&height[i]>height[st.top()]){int mid=height[st.top()];st.pop();if(!st.empty()){int h=min(height[i],height[st.top()])-mid;int w=i-st.top()-1;sum+=h*w;}}st.push(i);}}return sum;}
};

LeetCode:84.柱状图中最大的矩形

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);for(int i=1;i<heights.size();i++){//循环//条件1 大于等于的情况if(heights[i]>=heights[st.top()]){st.push(i);}//条件2 小于的情况else{while(!st.empty()&&heights[i]<heights[st.top()]){int mid=st.top();st.pop();if(!st.empty()){int left=st.top();int right=i;int h=heights[mid];int w=right-left-1;result=max(result,w*h);}}st.push(i);}}return result;}
};

感觉是最难理解的一部分了&完结撒花

【代码随想录】Day58~Day60单调栈相关推荐

  1. 代码随想录1刷—单调栈篇

    代码随想录1刷-单调栈篇 什么时候想到单调栈? 单调栈的原理? 单调栈工作过程? [739. 每日温度](https://leetcode.cn/problems/daily-temperatures ...

  2. 代码随想录算法训练营Day12 栈与队列

    #代码随想录算法训练营 代码随想录算法训练营Day12 栈与队列| 239. 滑动窗口最大值 347.前 K 个高频元素 总结 239. 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑 ...

  3. 代码随想录【day 10 栈与队列】| 232.用栈实现队列、 225. 用队列实现栈

    代码随想录[day 10 栈与队列]| 232.用栈实现队列. 225. 用队列实现栈 理论基础 LeetCode 232.用栈实现队列 题目链接:232.用栈实现队列 卡哥文解 视频讲解 解题思路( ...

  4. 代码随想录训练营day60

    题目一:柱状图中最大的矩形 力扣题目链接 题目描述: 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积 思路分析: ...

  5. 程序员代码面试指南 CD101 单调栈结构

    题目链接:点击这里 首先要明确的是,栈中存放的是索引. 扫描一遍数组元素,时刻保持从栈底到栈顶索引对应的数组元素是单调递增的. 当一个元素可以压入栈时,意味着此时的栈顶元素就是左边第一个比它小的元素. ...

  6. 代码随想录算法训练Day11 LeetCode232. 用栈实现队列(模拟);225.用队列实现栈(模拟);20. 有效的括号(栈应用);1047. 删除字符串中的所有相邻重复项(栈应用)

    代码随想录算法训练Day11 | LeetCode232. 用栈实现队列(模拟):225.用队列实现栈(模拟):20. 有效的括号(栈应用):1047. 删除字符串中的所有相邻重复项(栈应用) 关于栈 ...

  7. 力扣刷题记录-单调栈相关题目

    单调栈是指栈里的元素保持升序或者降序. 判别是否需要使用单调栈:通常是一维数组里面,需要寻找一个元素左边或者右边第一个比自己大或者小的元素的位置,则可以考虑使用单调栈:这样的时间复杂度一般为O(n). ...

  8. *【HDU - 1506】【POJ - 2559】Largest Rectangle in a Histogram(单调栈或动态规划)

    题干: Description A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...

  9. leetcode 739. 每日温度 单调栈解法和暴力法及其优化 c代码

    如题: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高, 请在该位置用 0 来代替.例如,给定一个列表 temperature ...

最新文章

  1. 机器学习中的方法技术与应用场景
  2. opencv通道拆分与合并:split和merge
  3. php web目录结构,目录结构
  4. html 鼠标单击单元格,vue-easytable点击表格中某个单元格操作
  5. linux+proc+原理,Linux内核中的Proc文件系统(一)
  6. ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第七天(非原创)
  7. mysql执行存储过程提示out of_PHP执行MYSQL存储过程报错:Commands out of sync; you can't run...
  8. 产品经理如何通过拆产品,持续提升产品能力?附案例
  9. matlab与水库调度,蛙跳算法优化水库调度,全局迭代中最优解未更新
  10. 【Gym - 101234G】Dreamoon and NightMarket 【子集中第K大元素】
  11. deepin下安装QT
  12. [bigdata-093] drool 规则引擎安装和试用(不全)
  13. word 多级列表标题设置
  14. H5之微信授权登陆 (uniapp网页版微信授权登录)
  15. 输入年份 计算 生肖 C语言实现
  16. 如何设置虚拟机访问外网
  17. unity入门2.0
  18. LPC1768的P0.27,P0.28管脚作为GPIO口输出需要外接上拉电阻才能输出高电平
  19. 如何批量将图片修改到同样大小尺寸?
  20. 假设有四个作业,它们的提交、运行时间如下表所示。若采用高响应比优先调度算法,试问平均周转时间和平均带权周转时间为多少?

热门文章

  1. 【Python作业:找零钱系统】
  2. C++实现随机数生成
  3. Android开发-应用中英文(语言)切换(二)
  4. douyin / kuaishou / huoshan / tiktok 高版本抓包 hook方案
  5. 计算机专业相关的创意产品,十款电脑支架设计欣赏,给你更聪明的十个产品设计创意方案...
  6. 【数理逻辑】命题逻辑 ( 等值演算 | 幂等律 | 交换律 | 结合律 | 分配律 | 德摩根律 | 吸收率 | 零律 | 同一律 | 排中律 | 矛盾律 | 双重否定率 | 蕴涵等值式 ... )
  7. IoTLink版本跟新V1.10.0
  8. 2019全国二级C语言的分值,2021年计算机二级题型及分值
  9. VCS工具学习笔记(3)
  10. 新泩直饮净水器进驻霍尼韦尔