单调栈算法笔记

单调栈算法笔记

单调栈

定义: 单调栈就是栈内元素递增或者单调递减的栈,并且只能在栈顶操作。单调栈的维护是O(n)的时间复杂度,所有元素只会进进栈一次

性质

  1. 单调栈里面的元素具有单调性;
  2. 元素加入栈前会把栈顶破坏单调性的元素删除;
  3. 使用单调栈可以找到元素向左遍历的第一个比他小的元素(单增栈),也可以找到元素向左遍历第一个比他大的元素(单减栈);
  4. 一般使用单调栈的题目具有以下的两点:
    • 离自己最近(栈的后进先出的性质)
    • 比自己大(小)、高(低);

注意:虽然称作是递增递减栈,但是实际存储的值并不是单调的,因为可以存坐标,只有坐标带入数组才是单调的。这样既可以存储数组的值,也可以存储数组下标。如下面的2,3,4例题。

例题

1、LeetCode 496. Next Greater Element I

class Solution {
   
   
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
   
   
        vector<int> res(nums1.size(),-1);
        unordered_map<int,int>map;
        stack<int>stk;
        for(int i = 0 ; i < nums2.size(); i++){
   
   
            while(!stk.empty()&& nums2[i] > stk.top()){
   
   
                map[stk.top()] = nums2[i];
                stk.pop();
            }
            stk.push(nums2[i]);

        }
        for(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值