【算法】-单调栈
思想
单调栈:
从左往右进行遍历,如果栈顶元素大于等于当前的元素,直接出栈(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
本文来自博客园,作者:jucw,转载请注明原文链接:https://www.cnblogs.com/Jucw/p/16301796.html