一个元素的Next Greater Element(NGE),就是之后的元素里,第一个比该元素大的数。若没有这样的数,则NGE为-1。
求出一个数组中,所有元素的“下一个较大元素”。
双层循环。对于每个元素,向右寻找比它大的元素。
思路:顺序扫描数组,对于每个元素x,都要看看栈顶元素是否小于x。若小于,则将其弹出,x就是其下一个较大元素。持续弹出元素,直到栈顶元素大于x(此时,栈中已没有比x小的元素)时停止。最后,将x入栈,开始下一轮循环。
这样会不会漏掉可能的元素呢?比如,会不会出现栈中元素为[1, 4],x为3的情况?答案是肯定不会的。由于4比1大,在前一轮循环中,x的值为4,1必定已经弹出了。
推论:任何时候,栈中元素都是递减的。我们可以证明一下:设栈中元素为:
[a, b, c, d]
如果b < c的话,那么在压入c之前,b就已经弹出了,那么b就不可能还在栈中,这与事实相矛盾。因此,b必然大于c。此结论适用于任何两个相邻元素,因此栈中元素从左到右是递减的。