zoukankan      html  css  js  c++  java
  • 单调栈问题解析

    单调栈是什么

    单调栈就是一个简单的栈,只不过运用了一些巧妙的逻辑,使得每次元素入栈后都保持这有序递增(或者递减),用来处理一种典型问题Next Greater Element

    比如求[2,1,2,4,3]的Next Greater Element,不存在设置-1

    结果是:[4,3,4,-1,-1]

    场景想象

    想象成一些人拍好一列,让你找出某个人后面比他大的是谁

    代码实现

    public class DandiaoStack {
        public static void main(String[] args) {
            int[] ans = nextGreater(new int[]{2, 1, 2, 4, 3});
            for (int an : ans) {
                System.out.print(an + " ");
            }
    
        }
    
        //求一个数组中每个元素的  比它大的下个元素,没有设置-1
        public static int[] nextGreater(int nums[]) {
            //初始化结果数组和栈
            int[] ans = new int[nums.length];
            Stack<Integer> stack = new Stack<>();
    
            //倒着把元素放进去
            for (int i = nums.length - 1; i >= 0; i--) {
                //放之前判断和栈顶元素的大小关系
                while (!stack.empty() && nums[i] >= stack.peek()) {
                    //如果栈顶元素小于要放的元素,把栈顶元素都弹出
                    stack.pop();
                }
                //弹出以后判断栈是否为空,如果为空设置-1,如果不为空设置为栈顶元素(此时栈顶元素就是下一个比他大的)
                ans[i] = stack.isEmpty() ? -1 : stack.peek();
    
                //最后入栈
                stack.push(nums[i]);
            }
            return ans;
        }
        
    }
    

    时间复杂度分析

    分析它的时间复杂度,要从整体来看:总共有 n 个元素,每个元素都被 push 入栈了一次,而最多会被 pop 一次,没有任何冗余操作。所以总的计算规模是和元素规模 n 成正比的,也就是 O(n) 的复杂度。

  • 相关阅读:
    模拟测试20190806
    替罪羊树学习日记
    [Usaco2015 Jan]Moovie Mooving
    [NOIP2016]愤怒的小鸟
    [BZOJ1556]墓地秘密
    [SDOI2009]学校食堂Dining
    [SCOI2008]奖励关
    [洛谷3930]SAC E#1
    [BZOJ2809/APIO2012]dispatching
    [Usaco2018 Open]Disruption
  • 原文地址:https://www.cnblogs.com/treasury/p/12751086.html
Copyright © 2011-2022 走看看