单调栈解决数组左右两边第一个比当前值大的数

题目描述

给你一个数组,请你求出每一个位置上左边以及右边距离最近的比它大的数。要求时间复杂度O(N)

思路分析

一般思路就是每个位置,左右遍历找,但是这样的时间复杂度是O(N^2),因此,如何实现时间复杂度O(N)?那就是要用到单调栈问题。

单调栈

维护一个栈,要求栈从上到下是从小到大的顺序。
流程:
把数组元素从前开始依次入栈,然后,每次入栈前,和栈顶元素比较,如果比栈顶元素小,就直接入栈,如果大于栈顶元素,就把栈顶元素出栈,同时,每出栈一个数,这个数其实就找到了结果,它栈下面的数,其实就是左边第一个比它大的数,让它出栈的那个数,就是右边第一个比它大的数。
为什么会这样?
首先来解释当前出栈的数,下面的数为什么是左边第一个比它大的数?左边第一个,其实就是上一个入栈的,对吧?如果他俩之间还有数,这个数,如果比下面的还大,那下面的应该弹出了,对吧?所以不可能。如果他俩之间的数比后面的大?那么,他俩就不应该挨着,对吧?因此,栈下面的数就是左边第一个比它大的数。
那么,为什么让他出栈的数是右边第一个比它大的数呢?
因为,如果不比她大,那么应该继续入栈才对,不需要出栈,对吧?如果比他大,那么,如果不是右边第一个,当前数应该早就弹出了,对吧?因此,让他出栈的数是右边第一个比它大的数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值