• 单调栈问题解析


    单调栈是什么

    单调栈就是一个简单的栈,只不过运用了一些巧妙的逻辑,使得每次元素入栈后都保持这有序递增(或者递减),用来处理一种典型问题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) 的复杂度。

  • 相关阅读:
    BZOJ 4236~4247 题解
    OCUI界面设计:滚动视图与分页控件初探
    大数乘法
    Effective C++ 11-17
    [Matlab+C/C++] 读写二进制文件
    Java 反射 方法调用
    如何使用LaTeX让自己不乱?
    LaTeX 相对于 Word 有什么优势?
    你在发表理科学术文章过程中有哪些经验值得借鉴?
    破译手势在对话中的意义
  • 原文地址:https://www.cnblogs.com/treasury/p/12751086.html
Copyright © 2020-2023  润新知