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

【算法日志】单调栈: 单调栈简介及其应用

代码随想录刷题60Day


目录

单调栈简介

单调栈的应用

下次更高温

下一个更大元素1

下一个更大元素2

接雨水

柱状图中最大矩形


单调栈简介

单调栈(Monotonic Stack)是一种特殊的栈数据结构,它满足元素的单调性,这种单调性需要自己建立和维护。单调栈分为单调递增栈和单调递减栈两种类型。

单调递增栈的特点是栈内元素从栈底到栈顶依次递增,而单调递减栈则是栈内元素从栈底到栈顶依次递减。

单调栈的主要应用是解决一些与找到元素的下一个更大或更小相关的问题。它通过维护一个递增或递减的栈,可以在常数时间内找到每个元素的下一个更大或更小的元素。

单调栈的基本操作包括:

入栈:将元素压入栈顶,同时保持栈的单调性。

出栈:从栈顶移除元素。

查找:检查栈顶元素,获取当前元素的下一个更大或更小的元素。

单调栈的应用

下次更高温

    vector<int> dailyTemperatures(vector<int>& temperatures) {int size = temperatures.size();vector<int> result(size, 0);stack<int> stack;stack.push(0);for (int i = 1; i < size; ++i){int j = stack.top();if (temperatures[i] > temperatures[j]){while (!stack.empty() && temperatures[i] > temperatures[j]){result[j] = i - j;stack.pop();if (!stack.empty())j = stack.top();}}stack.push(i);}return result;}

下一个更大元素1

	vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {int size1 = nums1.size();int size2 = nums2.size();unordered_map<int, int> umap;stack<int> stack;vector<int> result;stack.push(0);for (int i = 1; i < size2; ++i){int j = stack.top();if (nums2[j] < nums2[i]){while (!stack.empty() && nums2[j] < nums2[i]){umap.insert(pair<int, int>(nums2[j], nums2[i]));stack.pop();if (!stack.empty())j = stack.top();}}stack.push(i);}for (int i = 0; i < size1; ++i){if (umap.find(nums1[i]) != umap.end())result.push_back(umap[nums1[i]]);elseresult.push_back(-1);}return result;}

下一个更大元素2

	vector<int> nextGreaterElements(vector<int>& nums) {int size = nums.size();vector<int> dp(size, -1);stack<int> mystack;mystack.push(0);for (int i = 1; i < size; ++i){if (nums[i] > nums[mystack.top()]){while (!mystack.empty() && nums[i] > nums[mystack.top()]){dp[mystack.top()] = nums[i];if (!mystack.empty())mystack.pop();					}}mystack.push(i);}for (int i = 0; i < size; ++i){if (nums[i] > nums[mystack.top()]){while (!mystack.empty() && nums[i] > nums[mystack.top()]){dp[mystack.top()] = nums[i];if (!mystack.empty())mystack.pop();					}}mystack.push(i);}return dp;}

接雨水

	int trap(vector<int>& h){if (h.size() < 3)return 0;stack<int> mystack;int result = 0;mystack.push(0);for (int i = 1; i < h.size(); ++i){if (h[mystack.top()] > h[i])mystack.push(i);else if (h[mystack.top()] < h[i]){while (!mystack.empty() && h[mystack.top()] < h[i]){int mid = mystack.top();mystack.pop();if (!mystack.empty())result += (min(h[mystack.top()], h[i]) - h[mid]) * (i - mystack.top() - 1);				}if (!mystack.empty() && h[mystack.top()] == h[i])mystack.pop();mystack.push(i);}else{mystack.pop();mystack.push(i);}}return result;}

柱状图中最大矩形

	int largestRectangleArea(vector<int>& h) {h.push_back(0);int size = h.size();stack<int> mystack;int result = h[0];mystack.push(0);for (int i = 1; i < size; ++i){if (h[i] == h[mystack.top()]){mystack.pop();}else if (h[i] < h[mystack.top()]){int mid, left;while (!mystack.empty() && h[i] < h[mystack.top()]){mid = mystack.top();mystack.pop();if (!mystack.empty())left = mystack.top();elseleft = -1;result = max(result, (i - left - 1) * h[mid]);}}mystack.push(i);}return result;}

http://www.lryc.cn/news/163518.html

相关文章:

  • VSCode自动分析代码的插件
  • 设计模式之外观模式
  • Web端测试和 App端测试有何不同?
  • 12.(Python数模)(相关性分析一)相关系数矩阵
  • 系统架构设计师(第二版)学习笔记----嵌入式系统及软件
  • Python列表操作指南:索引、切片、遍历与综合应用
  • 第15章_锁: MySQL并发访问相同记录以及从数据操作的类型划分锁(读锁、写锁)
  • PHP 排序函数使用方法,按照字母排序等操作
  • windows本地验证码识别工具
  • 修改图片尺寸的几个简单方法
  • 三、GoLang字符串的基本操作
  • 基于vue-cli创建后台管理系统前端页面——element-ui,axios,跨域配置,布局初步,导航栏
  • 在 ubuntu20.04 上安装 Pytorch
  • 远程恋爱网站部署秘籍——群晖虚拟机助ni秀恩爱
  • vscode c++解决包含头文件红色波浪线问题
  • PostgreSQL docker compose安装配置
  • 电脑文件批量重命名:高效操作技巧
  • c高级day4(shell)
  • 整十粉丝庆祝文章系列内容征集建议
  • 两数乘积:输出1~100整数乱序列表中两数乘积是目标整数的最小下标对
  • 【JavaSE】面试01
  • Elasticsearch(二)kibana数据检索
  • JavaScript编程语法作业
  • 服务器中了Malloxx勒索病毒应该怎么办?勒索病毒解密,数据恢复
  • 如何实现Spring的事务管理功能:@Transactional声明式事务
  • LeetCode(力扣)122. 买卖股票的最佳时机 II
  • 串行通信协议
  • Elasticsearch中RestClient使用
  • 【LeetCode-中等题】208. 实现 Trie (前缀树)
  • python队列与多线程——生产者消费者模型