📅  最后修改于: 2023-12-03 14:57:33.417000             🧑  作者: Mango
在编程中,有时我们需要计算一个数组中每个元素右侧的较小素数。这个问题可以使用栈来解决。
栈是一种后进先出(LIFO)数据结构,它支持两种主要操作:压入(push)和弹出(pop),以及一个辅助操作获取栈顶元素(peek)。
我们可以使用一个栈来维护一个递减的元素序列,这些元素右侧的较小素数就是在该栈中的下一个元素。当我们遇到一个新元素,我们首先弹出所有小于该元素的栈顶元素,并将它们右侧的较小素数设置为该元素。然后,将该元素压入栈中。
我们可以使用一个栈来处理每个数组元素的右侧较小素数。
以下是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),因为我们需要创建一个额外的数组来存储每个元素的右侧较小素数。
这个算法在计算每个元素右侧较小素数的问题中非常实用。