📌  相关文章
📜  生成一个数组,由每个数组元素右侧出现的最频繁的较大元素组成(1)

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

生成一个数组,由每个数组元素右侧出现的最频繁的较大元素组成

简介

本程序的目的是生成一个数组,由每个数组元素右侧出现的最频繁的较大元素组成。

例如,对于数组 [2, 7, 3, 6, 8, 1, 10],其结果应为 [7, 8, 6, 8, 10, 10, -1]

实现方式

本程序采用了单调递减栈来解决问题。对于给定的数组 nums,遍历每个元素,维护一个单调递减栈 stack。对于每个元素 nums[i],在 stack 中找到第一个比它大的元素,并将其放到结果数组中。如果找不到比它大的元素,则把 -1 放到结果数组中。

代码如下:

def find_next_larger_numbers(nums: List[int]) -> List[int]:
    stack = []
    res = [0] * len(nums)

    for i in range(len(nums)):
        while stack and nums[stack[-1]] < nums[i]:
            res[stack.pop()] = nums[i]

        stack.append(i)

    # 将栈中剩余的元素赋值为 -1
    while stack:
        res[stack.pop()] = -1

    return res
使用方法

在调用函数时,传入一个整数数组即可。例如:

nums = [2, 7, 3, 6, 8, 1, 10]
res = find_next_larger_numbers(nums) # [7, 8, 6, 8, 10, 10, -1]
总结

本程序使用单调递减栈解决了生成一个数组,由每个数组元素右侧出现的最频繁的较大元素组成的问题。虽然时间复杂度为 O(n),空间复杂度也为 O(n),但是实际测试中运行速度较快。