📅  最后修改于: 2023-12-03 14:55:55.672000             🧑  作者: Mango
假设有两个数组nums1
和nums2
,请编写一个程序,对于nums1
中的每个元素,找出其在nums2
中的最接近的较大元素,并将结果组成一个新的数组返回。
输入:
nums1 = [4,1,2], nums2 = [1,3,4,2]
输出:
[-1,3,-1]
解释:
对于nums2
,我们可以先使用单调栈求出每个元素右边第一个比它大的元素(参见Largest Rectangle in a Histogram)。具体做法是,从左往右扫描nums2
,如果栈顶元素比当前元素小,那么弹出栈顶元素并更新结果数组。最后,剩余的元素对应的结果就是-1。
接下来,对于nums1
中的每个元素,在nums2
中找到这个元素的下标,然后在结果数组中查找这个下标对应的值即可。
def nextGreaterElement(nums1: List[int], nums2: List[int]) -> List[int]:
# 求出nums2中每个元素的下一个较大元素
stack = []
n = len(nums2)
next_large = [-1] * n
for i in range(n):
while stack and nums2[i] > nums2[stack[-1]]:
j = stack.pop()
next_large[j] = nums2[i]
stack.append(i)
# 在结果数组中查找
ans = []
for num in nums1:
index = nums2.index(num) # 可以使用字典优化
ans.append(next_large[index])
return ans
代码中,我们使用一个栈stack
维护一个递减的元素序列。当遇到一个比栈顶元素大的元素时,就可以弹出栈顶元素并更新结果数组。最后剩余的元素对应的结果就是-1。
由于后面我们需要在nums2
中查找元素的下标,这里我们使用了list.index()
方法。如果数组比较大且有重复元素,这样做的时间复杂度会比较高。可以使用字典优化。