单调栈理解与运用

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值