题目链接
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
代码
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
#思路单调栈
#先计算nums2中每个元素的后面大于它的第一个数,将这样的结果存在一个字典里,也就是d中;
#然后根据nums1中出现的值去d中查询结果
d = {}
s = []
n = len(nums2)
#定义结束后,开始对nums2进行单调栈(单调递减)
#注意!栈中存放的是索引,不是值!!!
for i in range(n):
#对于当前元素来说,如果它大于栈顶,这样就构不成单调递减,
#因此将栈顶pop出来,pop出的值的下一个更大元素是当前元素,将这一对映射加到d中
while s and nums2[i] > nums2[s[-1]]:
d[nums2[s.pop()]] = nums2[i]
s.append(i)
#我们最终得到的单调栈是一个单调递减序列,在栈中存在的每个元素的下一个更大元素都不存在
for idx in s:
d[nums2[idx]] = -1
res = []
#最后根据nums1中的值去d中查找结果存起来即可
for num in nums1:
res.append(d[num])
return res
备注
1、注意栈中存放的是索引,不是值。
2、这个做法较好理解,但不是最优,空间消耗大