【算法】-单调栈

思想

单调栈:
从左往右进行遍历,如果栈顶元素大于等于当前的元素,直接出栈(while 循环)
(退出while 循环两个条件,栈空,或者栈不为空,此时栈顶元素小于单前元素)
(if)如果栈不为空,表明栈顶元素小于当前元素,将栈顶元素保存在当前元素对应下标的数组中


从右边向左进行遍历:
(while) 如果栈顶元素大于当前元素,直接出栈
(if)退出while 循环,判断栈是否为空,如果栈不为空,栈顶元素就是右边最小元素,直接进赋值,然后让该元素进栈;

例子

当前元素下一个最小最大值;

code

当前元素下一个最小:

当前元素最近一个最小值

往左最近最小
往右最近最小

st = []
left, right = [], []
n = len(a)
for i, v in enumerate(a):
	while st and a[st[-1]]>v:
		st.pop()
	if st:
		left[i] = st[-1]
	st.append(i)
	
for i in range(n-1,-1,-1):
	v = a[i]
	while st and a[st[-1]]>v:
		st.pop()
	if st:
		right[i] = st[-1]
	st.append(i)

	
	
	
### 496. 下一个更大元素 I
nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

> 求解下一个最近更大的元素,使用的是倒叙比较;
由于b 数组元素比较多,先对b数组进行求解下一个最大,之后将a 数组对应进去
```python

class Solution:
    def nextGreaterElement(self, a: List[int], b: List[int]) -> List[int]:
        st = []
        n = len(b)
        res = [-1]*n
        ans = []
        # 求解b中下一个元素的最大值
        for i in range(n-1,-1,-1):
            v = b[i]
            while st and st[-1]<=v:
                st.pop()
            if st:
                res[i]=st[-1]
            st.append(v)
        for x in a:
            if x in b:
                idx = b.index(x)
                ans.append(res[idx])
        return ans

posted @ 2022-05-23 16:39  jucw  阅读(16)  评论(0编辑  收藏  举报