单调栈:
问题描述:给定一个数组 请确定每个元素左右距离最近的比它大的数字
常规想法: 到某一个元素时 通过两个for 分别获取其左边比它大的和右边比他大的数字 时间复杂度为O(n2)
最优解思路(单调栈):
1 一个按照从大到小顺序排序的栈结构 若在压栈过程中发现要压栈的元素和栈顶的元素相比要大 则弹出当前栈顶元素 并从开始弹出处记录 之后继续弹出的下一个即为距离最近的一个元素
注意: 到数组末尾时 但是栈中依然有元素 则此时元素弹出 右为null 而左边为栈中的下一元素
记得 观察 这个元素弹出的驱动是啥? 之前的是因为右边要压栈的比栈顶元素要大 所以可以弹出并记录信息
特殊情况:若出现相等元素情况 则将下标放在一起 等到出现比它们大的数字时再依次弹出即可
具体应用:
1 构造数组的maxtree:
思路1 : 按照大根堆思路建立 O(N)
思路2: 单调栈
按照单调栈的思路找到每个元素左右最近比它大的元素---分以下几种情况进行讨论:
1 若一个元素左右均是null 则它是全局最大的 直接作为根节点
2 若一个元素左或者右 只存在一个 则只具有唯一的父节点
3 若一个元素左右两个元素均存在 则选择其中最小的那个作为父节点