📌  相关文章
📜  计算每个数组元素右侧的较小素数(1)

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

计算每个数组元素右侧的较小素数

在编程中,有时我们需要计算一个数组中每个元素右侧的较小素数。这个问题可以使用栈来解决。

简介

栈是一种后进先出(LIFO)数据结构,它支持两种主要操作:压入(push)和弹出(pop),以及一个辅助操作获取栈顶元素(peek)。

我们可以使用一个栈来维护一个递减的元素序列,这些元素右侧的较小素数就是在该栈中的下一个元素。当我们遇到一个新元素,我们首先弹出所有小于该元素的栈顶元素,并将它们右侧的较小素数设置为该元素。然后,将该元素压入栈中。

算法

我们可以使用一个栈来处理每个数组元素的右侧较小素数。

  1. 创建一个栈来维护递减元素序列。
  2. 遍历数组:
    1. 如果栈为空,则将元素压入栈中。
    2. 如果栈不为空且当前元素小于栈顶元素,则将栈顶元素弹出,并将其右侧的较小素数设置为当前元素。
    3. 将当前元素压入栈中。
  3. 对于所有栈中的元素,它们右侧的较小素数均为None。
代码实现

以下是Python实现该算法的代码:

from typing import List

def next_smaller_elements(nums: List[int]) -> List[int]:
    stack = []
    res = [None] * len(nums)
    for i, num in enumerate(nums):
        while stack and nums[stack[-1]] > num:
            res[stack.pop()] = num
        stack.append(i)
    return res
总结

这个算法的时间复杂度为O(n),因为每个元素最多只会被压入和弹出一次,所以栈的大小不会超过n。空间复杂度也为O(n),因为我们需要创建一个额外的数组来存储每个元素的右侧较小素数。

这个算法在计算每个元素右侧较小素数的问题中非常实用。