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