1. 什么是单调栈: 单调意思是栈内的数据是由大到小,或者由小到大的(我们自己控制)。
2. 举例: 数字: 1, 5, 8, 3, 2 依次入栈
[1]
[1] 放入 5, 但1比5小我们人为pop, 现在为 [5]
同理 8比5 大,现在为[8]
[8, 3]
[8, 3, 2]
3. 什么时候用: 当题目需要我们找到比当前数字右侧(或者左侧)第一个大(或者小)的数字
4. 例子: 1, 5, 8, 3, 2 找到每一个数字右侧第一个比当前大的数字,没有输出-1,输出一个数组
[1]
[1] 放入 5, 但1比5小我们人为pop出1, 现在为 [5] // 此时第一个比1大的就是5
同理 8比5 大,现在为[8] // 此时第一个比5大的就是8
[8, 3]
[8, 3, 2]
我们的答案就是[5, 8, -1, -1, -1]
5. 复杂度分析, 单调栈只循环一遍为O(N), 如果我们用双循环则为O(N^2)。(举例,输入为 7,6,5,4,3,2,1。 每个数需要和右侧所有数比较,而单调栈则循环一遍)
6. 模板, num为输入数组
Stack<Integer> stack = new Satck<>();
for (int i = 0; i < num.length; i++ {
while (stack.size() != 0 && num[i] > stack.peek()) {
stack.pop();
// 此处不同题目写不同逻辑,比如上述问题我们可以存储stack.pop()的数字放入结果数组中
}
stack.push(num[i]);
}
7. 入门题目leetcode496