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

📅  最后修改于: 2023-12-03 15:12:04.520000             🧑  作者: Mango

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

在某些场景中,我们需要对一个数组中的元素进行特定的处理,例如对于每个元素找到它右侧第一个较小的素数。这是一道比较经典的算法问题,也是程序员在实际开发中会经常遇到的问题。

算法思路

我们可以使用单调栈的思路来解决这个问题。具体步骤如下:

  1. 从右往左遍历数组,对于每个元素,如果它是素数,直接将其入栈。
  2. 如果它不是素数,则从栈中弹出比它大的数,直到栈中的数是素数为止。
  3. 如果栈为空,说明该元素右边没有素数。
  4. 如果栈非空,则栈顶就是该元素右边第一个较小的素数。
代码实现

这里给出使用 Python 语言实现该算法的示例代码:

def next_smaller_primes(nums):
    """
    计算每个数组元素的右边第一个较小素数

    Args:
        nums: 需要处理的数组

    Returns:
        所有元素右边的第一个较小素数
    """
    stack = []
    res = [-1] * len(nums)
    for i in range(len(nums) - 1, -1, -1):
        while stack and stack[-1] <= nums[i]:
            stack.pop()
        if not stack:
            res[i] = -1
        else:
            res[i] = stack[-1]
        stack.append(nums[i])
    return res
测试用例

下面是该算法的测试用例,供程序员进行测试和调试:

assert next_smaller_primes([3, 5, 2, 8, 9, 2, 7, 1, 8, 10]) == [2, 2, -1, 2, 2, 2, 1, -1, -1, -1]
assert next_smaller_primes([7, 6, 8, 9, 1, 2, 3, 5]) == [2, 2, 1, 2, -1, -1, -1, -1]
总结

该算法的时间复杂度为 $O(n)$,空间复杂度也为 $O(n)$。通过单调栈的思路,我们可以很方便地解决该问题,同时也体现了单调栈的实际应用价值。