首页 > 其他分享 >单调栈

单调栈

时间:2022-09-18 16:45:18浏览次数:63  
标签:遍历 int top 元素 栈顶 stack 单调

一、应用场景

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。以空间换时间,复杂度为O(n)。

二、思路

(1)单调栈里面放的是元素下标i(比较的时候用num[i]获取)

(2)单调栈里面元素的顺序:求右边第一大时为从栈顶到栈底递增,右边第一小为递减

(3)具体情况:

  • 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况   
  • 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
  • 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况

三、举例 

求输入数组元素右边第一大的元素下标。 输入: [1,2,1]  输出: [1,-1,-1]

分析:

  • 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况  -->  为了保持栈是递增顺序,把元素T[i]压入栈 
  • 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况  -->  因为求的是右边第一个大于的元素而非大于等于,所以也需要把元素T[i]压入栈
  • 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况  -->  找到第一个大于的元素了,把栈内所有小于该元素的值全都弹出,并记录结果result[stack.top()] = i - stack.top()
class Solution {  
    public int[] findFirstBig(int[] T) {
        
        int lens=T.length;
        int []res=new int[lens];
        
        /**
        如果当前遍历的元素 大于栈顶元素,表示 栈顶元素的 右边的最大的元素就是 当前遍历的元素,
        	所以弹出 栈顶元素,并记录 
        	如果栈不空的话,还要考虑新的栈顶与当前元素的大小关系 
        否则的话,可以直接入栈。
        注意,单调栈里 加入的元素是 下标。
        */
        Deque<Integer> stack=new LinkedList<>();
        stack.push(0);
        for(int i=1;i<lens;i++){
            
            if(T[i]<=T[stack.peek()]){
                stack.push(i);
            }else{
                while(!stack.isEmpty()&&T[i]>T[stack.peek()]){
                    res[stack.peek()]=i-stack.peek();
                    stack.pop();
                }
                stack.push(i);
            }
        }

        return  res;
    }

参考:代码随想录

标签:遍历,int,top,元素,栈顶,stack,单调
From: https://www.cnblogs.com/cxuep/p/16705163.html

相关文章

  • 3.2.1 函数的单调性与最值
    \({\color{Red}{欢迎到学科网下载资料学习}}\)【基础过关系列】2022-2023学年高一数学上学期同步知识点剖析精品讲义(人教A版2019)\({\color{Red}{跟贵哥学数学,so\qua......
  • leetcode496-下一个更大元素I——单调栈解决下一个更大元素问题
     https://leetcode.cn/problems/next-greater-element-i/方法一:暴力vector<int> res;int size1=nums1.size(),size2=nums2.size();        for(int i=0;......
  • 单调队列优化dp与斜率优化dp
    单调队列优化dp是个相对比较不显然的优化。例题:P2034选择数字题意:一串正整数,选择若干个数使和最大,且没有连续的超过k个数被选择。首先显然是个dp题。方程也比较显然。......
  • Fast Bubble Sort (单调zai+倍增) (2022杭电多校10)
    VirtualJudge(vjudge.net)题目:题目大意:首先说明一个性质,A表示一个数组,B(A)表示把这段数组进行一遍冒泡排序的下沉操作,就是把大数沉底。然后题目给我们一个长度为n的......
  • 树的难题 BJOI2017 点分治 单调队列
    P3714[BJOI2017]树的难题没时间码先口胡。明显有一个n^2的暴力。可以拿到20分。链的情况也非常容易一个简单的单调队列就可以解决当然可以暴力的采用线段树。这样......
  • 【DP】决策单调性小记
    何谓决策单调性?指的就是在最优化dp中,状态的最优转移点单调不减的性质。这使得我们在做dp的时候可以减少冗余计算以达到优化的效果。这类优化方法常用于分段问题。0x......
  • 单调栈模板
    力扣503classSolution{public:vector<int>nextGreaterElements(vector<int>&nums){intn=nums.size();vector<int>ret(n,-1);......
  • leetcode738-单调递增的数字
    单调递增的数字贪心算法先对数字进行遍历,找出从零开始单调递增的子序列。如果此时i小于数组长度,意味着数组不是全部递增的,需要对数组进行修改。那么让i从后向前进行遍......