单调栈算法

这里写自定义目录标题

        • 什么是单调栈?
      • 范式:
        • 单调递增栈
        • 单调递减栈
        • 单调栈的作用:

什么是单调栈?

单调栈分为单调递增栈和单调递减栈,单调递增栈即栈内元素保持单调递增的栈,同理单调递减栈即栈内元素保持单调递减的栈,跟单调队列差不多,但是只用到它的一端,利用它可以用来解决一些ACM/ICPC和OI的题目,如RQNOJ 的诺诺的队列等。

范式:

单调递增栈

for(int i = 0; i < T.size(); i++){
  while(! stk.empty() && stk.top() > T[i]){
    ​stk.pop();
  }
  stk.push(A[i]);
}

单调递减栈

for(int i = T.size() - 1; i >= 0; i--){
  while(! stk.empty() && T[i] >= stk.top()){
    stk.pop();
  }         
  stk.push(i);
}

单调栈的作用:

可以以** O(1) 的时间复杂度得知某个位置左右两侧比他大(或小)的数的位置**,当你需要高效率获取某个位置左右两侧比他大(或小)的数的位置的的时候就可以用到单调栈。

求解数组中元素右边第一个比它小的元素的下标,从前往后,构造单调递增栈;
求解数组中元素右边第一个比它大的元素的下标,从前往后,构造单调递减栈;
求解数组中元素左边第一个比它小的元素的下标,从后往前,构造单调递减栈;
求解数组中元素左边第一个比它小的元素的下标,从后往前,构造单调递增栈。

总结:
以上就是单调栈的全部内容了,在刷 LeetCode 的时候,每次遇到精彩的题解都会感叹数据结构的伟大,通过巧妙地设计,无限的压榨着计算机的潜能,对那些设计出这些数据结构的人只剩下了膜拜!

作者:游戏开发小白变怪兽
链接:https://www.jianshu.com/p/43bb5204bc6f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(算法)