找最近一个比当前值大/小——单调栈

参考:https://leetcode-cn.com/problems/next-greater-element-ii/solution/cong-po-su-jie-fa-de-jiao-du-qu-li-jie-d-trht/

对于此类问题,最直接的方法就是两重遍历,但是时间复杂度太高。

之所以高,是因为在寻找每个元素的下一个大/小的元素时,我们都是遍历数组去主动寻找,而使用单调栈,存储尚未找到对应元素的元素的下标,每次进栈前,先进行判断,如果当前进栈元素符合前面的元素的条件,即将栈里面的元素弹出,直至不符合,再使当前元素进栈。

这样便不再是主动寻找,而是被动获取答案。

栈中存储的一直是未找到答案的元素的下标。

 具体思路:

建立「单调递减栈」,并对原数组遍历一次:

1. 如果栈为空,则把当前元素放入栈内;
2. 如果栈不为空,则需要判断当前元素和栈顶元素的大小:
  如果当前元素比栈顶元素大:说明当前元素是前面一些元素的「下一个更大元素」,则逐个弹出栈顶元素,直到当前元素比栈顶元素小为止。
  如果当前元素比栈顶元素小:说明当前元素的「下一个更大元素」与栈顶元素相同,则把当前元素入栈。

posted @ 2021-03-06 15:08  助手的fork  阅读(56)  评论(0编辑  收藏  举报