首页 > 其他分享 >单调栈

单调栈

时间:2024-08-18 22:27:35浏览次数:9  
标签:numsVector 元素 back item int 单调 size

单调证需要一直保证栈中元素是按序排列的。插入元素时首先检查,循环检查栈顶元素是否符合条件,不符合则弹出。不需要再将弹出元素插入回去。如果插入回去的话,其实整套程序逻辑实现就会多此一举,不如直接插入之后sort()即可。

class MyMonoStack{
public:
    // constructor
    MyMonoStack(): size(0){
        /* code */
    }
    // Push压栈
    void Push(int item){
   		// 循环检查栈顶元素是否大于要插入元素,要注意要考虑size是否为0,如果不考虑,size为0,nums.back()将会产生一个未定义行为,导致错误。
        while (size!= 0 && numsVector.back() > item){
            numsVector.pop_back();
            size--;
        }
        numsVector.push_back(item);
        size++;
    }
    // 弹出
    void Pop(){
        numsVector.pop_back();
    }
    // 获取size
    int GetSize(){
        return size;
    }
    // 打印信息
    void Print(){
        for (auto item : numsVector){
            std::cout << item << std::endl;
        }
        std::cout << "length-->" << size;
    }
private:
    std::vector<int> numsVector;
    int size;   
};

标签:numsVector,元素,back,item,int,单调,size
From: https://www.cnblogs.com/solicit/p/18366218

相关文章

  • 代码随想录 day31|| 56 合并区间,738 单调递增数字,968 监控二叉树
    56合并区间funcmerge(intervals[][]int)[][]int{ //思路先排序,然后按照后一个左区间和前一个右区间进行对比判断是否重叠,重叠扩充右区间 sort.Slice(intervals,func(i,jint)bool{ ifintervals[i][0]==intervals[j][0]{ returnintervals[i][1]<intervals[......
  • 【单调栈+倍增】[P7167 [eJOI2020 Day1] Fountain
    【单调栈+倍增】[P7167[eJOI2020Day1]Fountain思路用单调栈处理每个圆盘溢出后流到的第一个位置,然后倍增优化。代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);......
  • 决策单调性优化
    决策单调性优化对于形如\[f_i=\min_{j=0}^{i-1}\{f_j+w(j,i)\}\]的转移方程,记\(p_i\)为令\(f_i\)取得最小值的\(j\)的值(最优决策点)。若\(p\)单调不降,则称\(f\)具有决策单调性。四边形不等式以上述转移方程为例,四边形不等式的一个形式为:若对于任意\(......
  • 代码随想录算法训练营第二十七天| 56. 合并区间、738.单调递增的数字
    写代码的第二十七天最后一天贪心!!!加油呀!!!56.合并区间思路这道题本质上和昨天的两道题是几乎完全一致的,都是判断重叠区间,只不过昨天的射箭那道题是统计有多少重叠区间,无重叠区间那道题是找到重叠区间然后删除,这道题是找到重叠区间然后合并。解决问题1:如何对重叠区间进行......
  • 「单调优化 dp」做题记录
    「单调优化dp」做题记录P1941[NOIP2014提高组]飞扬的小鸟设\(f(i,j)\)表示使小鸟到达\((i,j)\)所需的最少点击数。不难写出转移方程:\[f(i,j)=\min\begin{cases}f(i-1,j+y_{i-1}),\text{if}j+y_{i-1}\lem\\f(i-1,x-kx_{i-1}),k\in\mathbb{N}......
  • 代码随想录算法训练营第50天 | 单调栈01
    代码随想录算法训练营第天|739.每日温度https://leetcode.cn/problems/daily-temperatures/description/代码随想录https://programmercarl.com/0739.每日温度.html#其他语言版本496.下一个更大元素Ihttps://leetcode.cn/problems/next-greater-element-i/description/......
  • 算法板子:滑动窗口——应用单调队列,找到窗口中的最小值与最大值
    #include<iostream>usingnamespacestd;constintN=1e6+10;inta[N];//q数组模拟单调队列;q数组存储原数组元素的下标;//递增单调队列的队头始终维护窗口中的最小值;队头存的是窗口中最小值的下标//递减单调队列的队头始终维护窗口中的最大值;队头存的......
  • 单调栈和单调队列
    单调栈和单调队列P5788#include<bits/stdc++.h>usingnamespacestd;constintN=3e6+5;intn,a[N],ans[N],top,stk[N];intmain(){ scanf("%d",&n); for(inti=1;i<=n;++i){ scanf("%d",&a[i]); while(top>0&&a[stk[......
  • 单调队列-滑动窗口最大值
    题目:给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。思路:通过双端队列,因为只看得到k个数字,所以先在队列放入k个数字,并且每次放入时都要将他与......
  • 单调队列优化DP
    通法:写的时候要灵活变通(可以考虑类似于双指针的技巧,如跳房子)。P3957[NOIP2017普及组]跳房子套个二分,然后由于与位置相关,所以维护一个左端点和右端点,右端点考虑最短步长会不会跳过头,左端点考虑最长步长会不会跳不到。修剪草坪满足连续性质,所以一次考虑一段,\(f_i\)保证\(......