相关题目
下一个最大元素1
下一个最大元素2
下一个最大元素3
其中前两个题目是关于单调栈的,第三个题目因为是在一起,就一起拿出来了
单调栈
指栈内元素单调排序,比如[5,3,2,1],这里以单调递减为例。
当我们碰到一个大于栈顶元素的值,需要不断弹出栈顶元素,直到栈空或者是栈顶元素大于等于当前元素。
下一个最大元素1
让你在一个超集里面找下一个最大元素,然后匹配到另一个集合,一看就是字典了。
那么怎么找下一个最大元素呢?
我们想这样一个问题,那就是排队,你站在人群中,是这样的:
无非就是找你能看到的前面一人的老阔(脑壳),那怎么用上单调栈呢?
遍历一遍数组,我们将先将第一个人压栈,然后看第二个人,数值比第一个大(也就是比第一个人高),那么我们就可以肯定,栈顶元素右边一定有比他高的人,我们将栈顶弹出,作为字典的key,也很明显此时的value就是当前元素(第二个人的身高)。
此时栈内只有第二个人,然后我们按第三个人,数值小于栈顶,将第三个人压入栈中,同时也说明,这两个人都是还没找到合适的‘老阔’;
到了第四个人,我们看到他比栈内的都大,所以将两个都弹出(当然是要按照顺序的!),然后字典中赋值key、value,将第四个人压栈。
第五个人,要比栈顶小,压入,结束循环。
此时栈内有第四个和第五个人,他们也就是右边没有高的人了,我们可以挨个弹出value=-1,也可以在子集中用成员运算符’in’
我选第二种:
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
stack = []
dic = {
}
for i in nums2:
while stack and stack[-1]<i:
dic