📌  相关文章
📜  每个数组元素中另一个数组中最接近的较大元素(1)

📅  最后修改于: 2023-12-03 14:55:55.672000             🧑  作者: Mango

每个数组元素中另一个数组中最接近的较大元素

介绍

假设有两个数组nums1nums2,请编写一个程序,对于nums1中的每个元素,找出其在nums2中的最接近的较大元素,并将结果组成一个新的数组返回。

示例

输入:

nums1 = [4,1,2], nums2 = [1,3,4,2]

输出:

[-1,3,-1]

解释:

  • 对于4,无法在nums2中找到比4大的元素,返回-1
  • 对于1,在nums2中3比1大,返回3
  • 对于2,无法在nums2中找到比2大的元素,返回-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()方法。如果数组比较大且有重复元素,这样做的时间复杂度会比较高。可以使用字典优化。