单调栈问题解析

单调栈是什么

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

原文地址:https://www.cnblogs.com/treasury/p/12751086.html